Få en Random att inte generera samma värde flera gånger

Permalänk

Få en Random att inte generera samma värde flera gånger

Hejsan jag försöker bygga ett program i Java där det går ut på att man får massor med frågor som ligger i en String array. Jag vill sen ha en Random som genererar en av de texterna som finns i min array. Detta får jag att fungera utan problem, jag kom då på att det skulle vara bra om man inte genererar samma tal flera gånger utan när en text väl blivit vald så kan man inte få samma igen. Allt detta är kopplat till en knapp och man ska generera en ny text av de i min array för varje knapp tryck men inte kunna få samma sak flera gånger.

Det är här mitt problem uppstår då jag inte har så stor koll på hur man gör detta har jag försökt med massor med olika saker. Som att försöka lägga till det man senaste genererade i en ArrayList och sen jämföra mot den. Detta verkar inte fungera något vidare bra, och programmet kraschar.

Jag antar att det jag har skrivit är helt fel och jag är ute på helt fel spår men om någon skulle kunna försöka leda mig i rätt riktning eller kunna förklara mera hur jag ska tänka så skulle jag vara jätte tacksam

Detta är vad jag skrivit hitintills:

String[] c = { "Hej", "Va", "Gör", "Du", "Idag", "För", "Något?" }; Random generator = new Random(); String text = Textbox.toString(); used.add(text); for (int i = 0; i < 65; i++) { Textbox.setText(c[generator.nextInt(65)]); if (Textbox.getText() == used) { Textbox.setText(c[generator.nextInt(65)]);

Permalänk
Permalänk
Medlem

Kan du inte bara spara värdet i en int och testa tills det inte är samma. Något liknande:

int old = -1; int new = -1; Random generator = new Random(); String text = Textbox.toString(); ... for (int i = 0; i < 65; i++) { do { new = generator.nextInt(65); } while (new == old); old = new; Textbox.setText(c[new]); }

Permalänk
Medlem

Kom på en liten algoritm..

Random rnd = new Random(); int len = c.length; // c är din sträng-array for (int i = 0; i < len-1; i++) { int n = i + rnd.nextInt(len - i); String picked = c[n]; System.out.println(picked); c[n] = c[i]; c[i] = picked; } System.out.println(c[len-1]);

Som en sideffekt ändras ordningen av c-arrayen.

edit: minioptimering.

edit2: extrakod, otestad. (har inte kodat java på hur länge som helst)

public <T> T[] shuffle(T[] array) { Random rnd = new Random(); int len = array.length; for (int i = 0; i < len-1; i++) { int n = i + rnd.nextInt(len - i); T swap = array[n]; array[n] = array[i]; array[i] = swap; } return array; }

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Tack så mycket för förslagen ska prova imorgon och se om det funkar

Skickades från m.sweclockers.com