Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[Java] Random functie in for loop

Pagina: 1
Acties:

  • Calvin&Hobbes
  • Registratie: December 2001
  • Laatst online: 17-11 10:45
Ik wil een reeks van 25 bestaande uit combinaties van 3 random letters en 2 random hoog(1)/laag(0) creeren, alleen met mijn code hieronder worden reeksen gecreeerd in de vorm van AAAAAAA11111111 of BBBBBBB111111 etc., niet echt random dus. Heb het idee dat de for loop te snel gaat ofzo ivm random & timestamp seed?


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
for (i=1;i<=26;i++){
                Random generator = new Random();
        int r = generator.nextInt(3);

        String myString1 = "";
            switch(r){
        case 0:
        myString1 = "A";
        break;
        case 1:
        myString1 = "B";
        break;
        case 2:
        myString1 = "C";
        break;
        }

            r = generator.nextInt(2);
        String myString2="";
        //String myString2 = Integer.toString(r);
        switch(r){
        case 0:
        myString2 = "1";
        break;
        case 1:
        myString2 ="0'";
        break;
        }
            
            String myStringTotal1 = myString1 + myString2 + myString3;
            myStringTotal2 = myStringTotal2.concat(myStringTotal1);     
    }
                
Output.setText('\n' + myStringTotal2);

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 13:19
en als je je new Random(); buiten de loop zet?

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 11-11 22:05
Je loopt 26x de lus door en gaat dan pas iets met de (laatste!) string doen...

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        Random generator = new Random();
        
        for (int i = 0; i < 25; i++) {
            
            String firstPart = "";
            for (int j = 0; j < 3; j++) {
                String string1;
                switch (generator.nextInt(3)) {
                case 0:
                    string1 = "A";
                    break;
                case 1:
                    string1 = "B";
                    break;
                case 2:
                    string1 = "C";
                    break;
                default:
                    string1 = "A";
                    break;
                }
                firstPart += string1;
            }
            
            
            String secondPart = "";
            for (int j = 0; j < 2; j++) {
                String string2 = generator.nextBoolean() ? "1" : "0";
                secondPart += string2;
            }
            String full = firstPart + secondPart;
            System.out.println(full);
        }

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

De initialisatie van de Random buiten de loop zetten lost het probleem op. De reden is dat Random in de standaard java.util implementation alleen een seed op basis van de timestamp (in ms) gebruikt. Als die voldoende dicht bij elkaar liggen (doordat alle iteraties van de loop binnen pakweg een ms worden uitgevoerd), dan is je seed hetzelfde en zal de eerste waarde die er uit komt ook hetzelfde zijn.

Het is overigens ook onzinnig om telkens een nieuw Random object aan te maken. Daar wordt de String niet meer willekeurig van. Als je echt denkt dat dat nodig is, dan zou je er tussendoor af en toe een nieuwe seed in kunnen gooien, bijvoorbeeld op basis van onvoorspelbaar netwerkverkeer. Uitgezonderd cryptografische toepassingen heb je dat niet nodig. Het onderliggende algoritme, de Mersenne twister, zorgt voor voldoende randomness.

[ Voor 44% gewijzigd door Confusion op 04-07-2008 07:10 ]

Wie trösten wir uns, die Mörder aller Mörder?


  • Calvin&Hobbes
  • Registratie: December 2001
  • Laatst online: 17-11 10:45
Ah geweldig, thnx voor de uitleg Confusius en Simeon voor de nette code!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14:02

Robtimus

me Robtimus no like you

Kijk voor String concatenatie ook eens naar StringBuilder (Java 5.0+) of StringBuffer. Die zijn een stuk efficienter als je veel string mutaties moet uitvoeren.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 20-09 21:57

JaWi

maak het maar stuk hoor...

IceManX schreef op vrijdag 04 juli 2008 @ 11:02:
Kijk voor String concatenatie ook eens naar StringBuilder (Java 5.0+) of StringBuffer. Die zijn een stuk efficienter als je veel string mutaties moet uitvoeren.
Muah, de Java compiler is inmiddels slim genoeg om zelf te bepalen dat een StringBuilder gebruikt moet worden. Desalniettemin, het is een "best practice" om dat zelf ook te doen...

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
JaWi schreef op vrijdag 04 juli 2008 @ 16:02:
[...]


Muah, de Java compiler is inmiddels slim genoeg om zelf te bepalen dat een StringBuilder gebruikt moet worden. Desalniettemin, het is een "best practice" om dat zelf ook te doen...
Ik denk dat dat nogal tegenvalt. In deze code zal in iedere iteratie een nieuwe StringBuilder worden gemaakt en gebruikt en aan het einde van de iteratie worden omgezet naar een String, dat is toch een stuk minder efficient dan zelf een StringBuilder maken buiten de loop en gebruiken in de loop.
Pagina: 1