2013-03-31 17 views
7

Wie kann ich Zufallszahlen von 0 - 4 so generieren, dass die gleiche Zahl nicht zweimal hintereinander generiert wird? Wenn zum Beispiel 3 die Nummer ist, die beim ersten Mal erzeugt wird, dann sind 0,1,2,4 die möglichen Zahlen für die Zufallserzeugung beim zweiten Mal. Wenn 2 das zweite Mal erzeugt wird, dann sind 0,1,3,4 die möglichen Zahlen für die Zufallserzeugung das dritte Mal und so weiter. Generieren von Zufallszahlen ohne fortlaufende Wiederholung

+0

Sie können nicht beliebig weniger zufällig machen. Verwenden Sie ein NSSet für das Unigeln. – CodaFi

+0

mögliches Duplikat von [Zufallszahl aus gegebener Nummer erzeugen] (http://stackoverflow.com/questions/15680582/generate-random-number-from-given-number) –

+0

Siehe auch http://stackoverflow.com/a/ 56656/1187415. –

Antwort

5
int oldrand = <prior random number>; 
int adder = randomNumberGenerator() % 4; 
int newrand = (oldrand + adder + 1) % 5; 
+0

Ich bin mir nicht sicher, ob ich verstehe, wie diese Lösung funktioniert. Ich würde es schätzen, wenn Sie weiter erklären. – oopology

+1

@oopology - Sie haben eine Nummer 0 .. 4. Sie wollen eine andere Nummer im selben Bereich, nur nicht genau die gleiche Nummer.Fügen Sie also eine beliebige Zahl zwischen 1 und 4 zur ersten Zahl hinzu. Wenn die Addition überläuft, "wickeln Sie sie herum". Also, wenn Ihre erste Zahl 3 ist und Sie einen zufälligen Wert 2 wählen, dann addieren Sie 3 + 2 + 1, Sie erhalten 6, was größer als Ihr Bereich ist. Aber 5 Wraps zu 0 und 6 Wraps zu 1, also ist dein Ergebnis 1. –

+0

danke für die Erklärung. Ich wünschte, ich hätte genug Stimmen, um Ihre Erklärung zu geben und eine Abstimmung abzugeben. – oopology

1
uint32_t myRandomNumber(uint32_t upperBound, uint32_t avoid) { 
    if (avoid < upperBound) { 
     --upperBound; 
    } 
    uint32_t number = arc4random_uniform(upperBound); 
    if (number >= avoid) { 
     ++number; 
    } 
    return number; 
} 

es, wie dies das erste Mal Aufruf:

uint32_t number = myRandomNumber(5, 5); 

es wie folgt nach dem ersten Aufruf:

number = myRandomNumber(5, number); 
0

kann es bei der Verwendung von 2-Arrays erzeugt werden; 1 wird sortiert und der andere, indem zufällige Objekte sortierter Form wie

-(NSMutableArray *)generateRandomNumbersFrom:(int) a to:(int)b 
{ 

    NSMutableArray * numbersWillBeChosen=[NSMutableArray new]; 
    NSMutableArray * randomList=[NSMutableArray new]; 
    //add the numbers that will create your ramdom list in order 
    for(int k=0;k<=(b-a);k++) 
    { 
     [numbersWillBeChosen addObject:@(a+k)]; 
    } 


    //create random list 
    for (int p=(b-a)+1; p>0; p--) { 

     int rand= arc4random()%p; 

     [randomList addObject:[numbersWillBeChosen objectAtIndex:rand]]; 

     [numbersWillBeChosen removeObjectAtIndex:rand]; 


    } 

    NSLog(@"%@",randomList); 

return randomList; 
    } 

erstellt wird, und Sie können

randList=[self generateRandomNumbersFrom:0 to:4]; 
0

Ich versuchte Hot lecken Antwort für Ihre Situation anrufen und es endete Duplikate für mich zu erzeugen (oder außerhalb der Bereichsnummern). Aber es hat mich inspiriert, eine Lösung zu finden, die für mich funktioniert hat.

Mein Code ist C#, aber Sie können ihn an Ihre Bedürfnisse anpassen.

//Returns a random number not same as previous random number. ie. no 2 consec random 
public static int NonConsecRandom(int max, int? lastNum=null) 
{ 
    if (lastNum == null) 
     return Random.Range(0, max); 

    int last = (int)lastNum;    
    return Random.Range(last + 1, last + max) % max; 
} 

Erläuterung:

ersten Block gibt nur eine Zufallszahl, wenn es keine zuvor Nummer generiert.

Der zweite Teil erzeugt eine Zufallszahl aus den "anderen Zahlen".

Zum Beispiel, wenn mein "max" war 5, die möglichen Zufallszahlen sind: 0, 1, 2, 3, 4

Lets meine letzte Nummer sagen 2 war, jetzt will ich eine Zufallszahl zwischen [ 3, 4, 0, 1]

Also erzeuge ich eine zufällige zwischen letzten + 1 und letzten + max. dh zwischen 3 (einschließlich) und 7 (nicht inklusive)

[3, 4, 5, 6]

Mod eine dieser Zahlen mit max (dh 5) und Sie erhalten eine Zufallszahl erhalten in der gewünschte Bereich: [3, 4, 0, 1]

Verwandte Themen