2013-03-31 14 views
7

Jak wygenerować losowe liczby całkowite z przedziału od 0 do 4 w taki sposób, aby ten sam numer nie był generowany dwa razy pod rząd? Na przykład, jeśli 3 jest liczbą, która jest generowana za pierwszym razem, wówczas 0,1,2,4 będzie możliwymi liczbami do losowego wygenerowania po raz drugi. Jeśli 2 zostanie wygenerowany po raz drugi, to 0,1,3,4 będzie możliwą liczbą do losowego wygenerowania po raz trzeci i tak dalej.generowanie liczb losowych bez kolejnych powtórzeń

+0

Nie można zrobić losowego mniej losowego. Użyj NSSet do unifikacji. – CodaFi

+0

możliwy duplikat [Generuj losową liczbę z podanej liczby] (http://stackoverflow.com/questions/15680582/generate-random-number-from-given-number) –

+0

Zobacz także http://stackoverflow.com/a/ 56656/1187415. –

Odpowiedz

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

Nie jestem pewien, czy rozumiem, jak działa to rozwiązanie. Byłbym wdzięczny, gdybyś wyjaśnił dalej. – oopology

+1

@oopologia - Masz numer 0 .. 4. Chcesz innej liczby w tym samym zakresie, tylko nie dokładnie tyle samo.Więc dodaj dowolną liczbę od 1 do 4 do pierwszej liczby, a następnie, jeśli dodatek się przepełni, "zawiń". Więc jeśli twoja pierwsza liczba to 3, a wybierzesz losową wartość 2, to dodaj 3 + 2 + 1, otrzymasz 6, która jest większa od twojego zasięgu. Ale 5 zawija do 0 i 6 zawija do 1, więc twój wynik to 1. –

+0

dzięki za wyjaśnienie. Żałuję, że nie mam wystarczającej liczby głosów, by przedstawić twoje wyjaśnienia i odpowiedzieć na głos. – 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; 
} 

to nazwać jak to po raz pierwszy:

uint32_t number = myRandomNumber(5, 5); 

Wywołanie to w ten sposób po raz pierwszy:

number = myRandomNumber(5, number); 
0

może być generowana przy użyciu 2 tablic; 1 są sortowane, a drugi jest tworzony poprzez przypadkowe przedmioty tworzą klasyfikowane jak

-(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; 
    } 

i można zadzwonić do sytuacji

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

Próbowałem odpowiedź Hot lizać i skończyło się na generowaniu duplikaty dla mnie (lub poza zakresem numerów). Ale to zainspirowało mnie do znalezienia rozwiązania, które zadziałałoby dla mnie.

Mój kod to C#, ale możesz go zmodyfikować zgodnie ze swoimi potrzebami.

//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; 
} 

Objaśnienie:

pierwszy blok po prostu zwraca liczbę losową Jeśli nie było wcześniej wygenerowany numer.

Druga część generuje losową liczbę z "innych liczb".

Na przykład, jeśli mój "max" był 5, możliwych liczb losowych są: 0, 1, 2, 3, 4

Powiedzmy moja ostatnia liczba to 2, teraz chcę losową liczbę wśród [ 3, 4, 0, 1]

Tak więc generuję losowe wartości między ostatnim + 1 a ostatnim + maks. czyli między 3 (włącznie) i 7 (nie włącznie)

[3, 4, 5, 6]

Mod każda z tych liczb z max (czyli 5), a otrzymasz liczbę losową w żądany zakres: [3, 4, 0, 1]

Powiązane problemy