2013-03-31 14 views
7

Come posso generare numeri casuali da 0 a 4 in modo che lo stesso numero non venga generato due volte consecutivamente? Ad esempio, se 3 è il numero che viene generato la prima volta, allora 0,1,2,4 saranno i numeri possibili per la generazione casuale la seconda volta. Se 2 viene generato la seconda volta allora 0,1,3,4 saranno i numeri possibili per la generazione casuale la terza volta e così via.generazione di numeri casuali senza ripetizione consecutiva

+0

Non è possibile rendere casuali meno casuali. Utilizzare un NSSet per l'uniquing. – CodaFi

+0

possibile duplicato di [Genera numero casuale dal numero dato] (http://stackoverflow.com/questions/15680582/generate-random-number-from-given-number) –

+0

Vedere anche http://stackoverflow.com/a/ 56656/1187415. –

risposta

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

Non sono sicuro di aver capito come funziona questa soluzione. Lo apprezzerei se spiegassi ulteriormente. – oopology

+1

@oopology - Hai un numero 0 .. 4. Vuoi un altro numero nello stesso intervallo, solo non esattamente lo stesso numero.Quindi aggiungi qualsiasi numero compreso tra 1 e 4 al primo numero, quindi, se l'aggiunta trabocca, "avvolgi tutto". Quindi se il tuo primo numero è 3 e scegli un valore casuale 2, quindi aggiungi 3 + 2 + 1, ottieni 6, che è più grande del tuo intervallo. Ma 5 avvolge a 0 e 6 avvolge a 1, quindi il risultato è 1. –

+0

grazie per la spiegazione. Vorrei avere abbastanza voti per dare la tua spiegazione e rispondere a un voto alto. – 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; 
} 

chiamare in questo modo la prima volta:

uint32_t number = myRandomNumber(5, 5); 

chiamare in questo modo dopo la prima volta:

number = myRandomNumber(5, number); 
0

può essere generato con l'utilizzo di 2 allineamenti; 1 è ordinato e l'altro è stato creato da prendendo oggetti casuali forma ordinato come

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

e si può chiamare per la vostra situazione

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

ho cercato la risposta di Hot Lick ed è finito per generare i duplicati per me (o fuori dai numeri di intervallo). Ma mi ha ispirato a trovare una soluzione che funzionasse per me.

Il mio codice è C#, ma è possibile modificarlo in base alle proprie esigenze.

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

Spiegazione:

primo blocco restituisce solo un numero casuale se non ci fosse in precedenza numero generato.

la seconda parte genera un numero casuale dagli "altri numeri".

Per esempio se il mio "max" è stato 5, i possibili numeri casuali sono: 0, 1, 2, 3, 4

consente di dire il mio ultimo numero era 2, ora voglio un numero casuale tra [ 3, 4, 0, 1]

Così generato un intervallo tra ultimo + 1 e ultimo + max. cioè tra 3 (compreso) e 7 (non incluso)

[3, 4, 5, 6]

Mod uno qualsiasi di questi numeri con max (cioè 5) e si otterrà un numero casuale in l'intervallo desiderato: [3, 4, 0, 1]

Problemi correlati