2012-02-16 10 views
10

Sto usandojavascript/jquery numero casuale compreso tra -13 e 13 esclusi i numeri compresi tra -3 e 3

var min = -13; 
var max = 13; 
var random = Math.floor(Math.random() * (max - min + 1)) + min; 

ma restituisce tutti i numeri (casuale) tra -13 e 13. come posso farlo generare un numero casuale compreso tra -13 e -4 escluso -3, -2, -1, 0, 1, 2, 3 e compreso da 4 a 13.

+0

I don Penso che sia possibile. Vorrei creare un array con i valori desiderati e accedere in modo casuale all'array –

+1

@EvilP, che convertirà un'operazione di tempo e spazio costante in uno lineare di tempo e spazio. È come aggiungere 100 a un numero aggiungendo 1 cento volte. Funziona, ma è, a dir poco, sconsigliabile. – davin

+0

@davin come funziona l'ora lineare di accesso alla matrice – Esailija

risposta

15

Ottenere un numero casuale compreso tra 1-10 e aggiungere 3, a ottenere uno tra i 4-13:

random = Math.ceil(Math.random() * 10) + 3; 

generare un casuale tra 0-1 . Se è 0, rendere il numero negativo:

random = (Math.floor(Math.random() * 2) == 0) ? 0 - random : random; 

JSFiddle mostrando copia di lavoro:

http://jsfiddle.net/adamh/cyGwf/

+1

il segno può essere facilmente generato semplicemente da 'casuale = (Math.random() <0,5)? -Random: casuale; 'bisogno di chiamare' math.floor' – fcalderan

+0

questo è brillante ringraziamento –

+0

Il rischio è estremamente piccolo, ma sapendo che Math.random() fornisce valori [0-1 (incluso!) (escluso!) ] (http://stackoverflow.com/q/11730263), la prima riga POTREBBE fornire un valore di 3. Quindi una pratica leggermente più pulita per andare con Math.floor e lavorare da lì: 'random = Math.floor (Math. random() * 10) + 4; ' –

0
var sign = Math.round(Math.random()) == 0 ? -1 : 1; 
var number = Math.round(Math.random() * 9) + 4; 
return sign * number; 
1

Per quanto ne so, non è possibile generare un numero casuale e prendere in conto di un set di esclusione. È necessario creare una funzione ricorsiva per fare il filtraggio per te. Vedi sotto:

function GenerateRandomNumber() { 
    var min = -13, max = 13; 
    var random = Math.floor(Math.random() * (max - min + 1)) + min; 

    // If random number is undesirable, generate a new number, else return 
    return (random < 4 && random > -4) ? GenerateRandomNumber() : random; 
} 

var myRandomNumber = GenerateRandomNumber(); 
​ 

Ecco il numero a working fiddle.

Oppure, per gentile concessione @Rozwel, una versione non ricorsiva con un ciclo while:

function GenerateRandomNumber() { 
    var min = -13, max = 13; 
    var random = 0; 

    while (random < 4 && random > -4) { 
     random = Math.floor(Math.random() * (max - min + 1)) + min; 
    } 

    return random; 
} 

Ecco a jsperf che mette a confronto la risposta accettata con queste due opzioni.

+0

si potrebbe teoricamente entrare in un loop infinito – fcalderan

+0

@FabrizioCalderan, dici sul serio? -1 per una possibilità teorica (sebbene matematicamente impossibile)? –

+1

@JamesHill, Il codice entrerà in un ciclo con probabilità zero e ha un tempo di esecuzione previsto lineare, quindi in teoria questo codice non è male. Hai fatto downvotare il tuo post? – davin

1

Piccolo tweak a quello che devi fare. Produrre un random nell'intervallo da -6 a 13, e quindi se il valore è inferiore a 4, sottrarre 7. Non l'ho testato, ma sospetto che sarebbe meglio che produrre due randoms e moltiplicare.

var min = -6; 
var max = 13; 
var random = Math.floor(Math.random() * (max - min + 1)) + min; 
if(random < 4){random = random - 7;} 
1
var pickOne = [4,5,6,7,8,9,10,11,12,13], 
    value = pickOne[Math.floor(Math.random() * pickOne.length)]; 

value = (Math.random() < 0.5)? value : -value; 
console.log(value) 
0

Math.round (Math.random()) restituisce 0 o 1,

in modo che possa essere scritta senza alcun valore intermedio:

alert((Math.ceil(Math.random() * 10) + 3)*(Math.round(Math.random())?1:-1)); 
0
var n = Math.floor(Math.random() * 20) - 10; 
n = n < 0 ? n - 3 : n + 4; 
Problemi correlati