numero casuale di matematica senza ripetere un numero precedente

Non riesco a trovare una risposta a questo, dico che ho questo:

setInterval(function() { m = Math.floor(Math.random()*7); $('.foo:nth-of-type('+m+')').fadeIn(300); }, 300); 

Come faccio a fare in modo che il numero casuale non si ripeta. Ad esempio se il numero casuale è 2, non voglio che il 2 venga fuori di nuovo.

Ci sono molti modi in cui puoi ottenere questo.

Soluzione A: Se l’intervallo di numeri non è ampio (diciamo meno di 10), puoi semplicemente tenere traccia dei numeri che hai già generato. Quindi se si genera un duplicato, scartarlo e generare un altro numero.

Soluzione B: pre-generare i numeri casuali, memorizzarli in una matrice e quindi passare attraverso la matrice. Puoi farlo prendendo i numeri 1,2,...,n e poi mescolandoli. Vedi http://snippets.dzone.com/posts/show/849

 var randorder = shuffle([0,1,2,3,4,5,6]); var index = 0; setInterval(function() { $('.foo:nth-of-type('+(randorder[index++])+')').fadeIn(300); }, 300); 

Soluzione C: tenere traccia dei numeri disponibili in un array. Scegli un numero a caso. Rimuovere il numero da detto array.

 var randnums = [0,1,2,3,4,5,6]; setInterval(function() { var m = Math.floor(Math.random()*randnums.length); $('.foo:nth-of-type('+(randnums[m])+')').fadeIn(300); randnums = randnums.splice(m,1); }, 300); 

Sembra che vogliate un numero casuale non ripetuto da 0 a 6, così simile alla risposta di tskuzzy:

 var getRand = (function() { var nums = [0,1,2,3,4,5,6]; var current = []; function rand(n) { return (Math.random() * n)|0; } return function() { if (!current.length) current = nums.slice(); return current.splice(rand(current.length), 1); } }()); 

Restituirà i numeri da 0 a 6 in ordine casuale. Quando ciascuno è stato estratto una volta, ricomincia.

potresti provarlo,

 setInterval(function() { m = Math.floor(Math.random()*7); $('.foo:nth-of-type(' + m + ')').fadeIn(300); }, 300); 

In genere il mio approccio è quello di creare una matrice contenente tutti i valori possibili e di:

  1. Scegli un numero casuale < = la dimensione dell'array
  2. Rimuovi l’elemento scelto dall’array
  3. Ripeti i passaggi 1-2 fino a quando l’array non è vuoto

La serie risultante di numeri conterrà tutti i tuoi indici senza ripetizione.

Ancora meglio, forse qualcosa di simile:

 var numArray = [0,1,2,3,4,5,6]; numArray.shuffle(); 

Quindi passa attraverso gli oggetti perché shuffle li avrà randomizzati e li farà uscire uno alla volta.

Mi piace la risposta di Neal, anche se questa è una supplica per qualche ricorsione. Eccolo in java, avrai ancora un’idea generale. Tieni presente che otterrai un numero infinito di loop se tiri fuori più numeri di MAX, potrei averlo risolto ma lasciato come è per chiarezza.

edit: saw neal ha aggiunto un ciclo while in modo che funzioni alla grande.

 public class RandCheck { private List numbers; private Random rand; private int MAX = 100; public RandCheck(){ numbers = new ArrayList(); rand = new Random(); } public int getRandomNum(){ return getRandomNumRecursive(getRand()); } private int getRandomNumRecursive(int num){ if(numbers.contains(num)){ return getRandomNumRecursive(getRand()); } else { return num; } } private int getRand(){ return rand.nextInt(MAX); } public static void main(String[] args){ RandCheck randCheck = new RandCheck(); for(int i = 0; i < 100; i++){ System.out.println(randCheck.getRandomNum()); } } } 

non so se è troppo tardi, ma vorrebbe comunque aggiungere–

 var RecordKeeper = {}; SRandom = function () { currTimeStamp = new Date().getTime(); if (RecordKeeper.hasOwnProperty(currTimeStamp)) { RecordKeeper[currTimeStamp] = RecordKeeper[currTimeStamp] + 1; return currTimeStamp.toString() + RecordKeeper[currTimeStamp]; } else { RecordKeeper[currTimeStamp] = 1; return currTimeStamp.toString() + RecordKeeper[currTimeStamp]; } } 

questo in pratica utilizza il timestamp (ogni millisecondo) per generare sempre un numero univoco.

Ecco una soluzione semplice, se un po ‘rudimentale:

 if(nextNum == lastNum){ if (nextNum == 0){nextNum = 7;} else {nextNum = nextNum-1;} } 

Se il numero successivo è uguale all’ultimo, meno 1 a meno che il numero non sia 0 (zero) e lo imposti su qualsiasi altro numero all’interno del set (ho scelto 7, l’indice più alto).

Ho usato questo metodo all’interno della funzione del ciclo perché l’unica condizione per la selezione di un numero era che non fosse lo stesso dell’ultimo.

Non è la soluzione più elegante o tecnicamente dotata, ma funziona 🙂

Puoi farlo. Avere una serie pubblica di chiavi che hai usato e confrontarle con questa funzione:

 function in_array(needle, haystack) { for(var key in haystack) { if(needle === haystack[key]) { return true; } } return false; } 

(funzione da: funzione javascript inArray )

Quindi quello che puoi fare è:

 var done = []; setInterval(function() { var m = null; while(m == null || in_array(m, done)){ m = Math.floor(Math.random()*7); } done.push(m); $('.foo:nth-of-type('+m+')').fadeIn(300); }, 300); 

Questo codice rimarrà bloccato dopo aver ottenuto tutti e sette i numeri, quindi è necessario accertarsi che esista dopo averli mollati tutti.