2012-01-18 11 views
5

Ciao ho bisogno di generare un numero casuale in JavaScript tra i 15 ei 225 che può essere solo con incrementi di 30. Ad esempio: 45, 75, 105 eccNumero casuale JavaScript compreso tra 15 e 225 incrementi di 30?

Delle idee su come questo può essere fatto? Sono a conoscenza di Math.floor(Math.random()*11) ad esempio per un numero casuale 1-10, ma come può essere modificato per adattarsi a quello che sto cercando di fare?

+0

'Math.floor (Math.random() * 11)' restituirà un numero '[0-10]', mentre 'Math.floor (Math.random() * 10) + 1' sarà restituire un numero '[1-10]'. – zzzzBov

risposta

3

È necessario pensare il risultato finale che si desidera. Tra 15 e 225 è quello che vuoi puntare, ma non quello con cui devi lavorare per ottenere il risultato.

225/30 = 7,5. 15 è la metà di 30. Pertanto, (225-15)/30 = 7. Si desidera un numero casuale compreso tra 1 e 7, che moltiplicherà per 30 e aggiungerà 15 al risultato finale.

var myNumber = Math.floor(Math.random()*7); 
myNumber = myNumber *30 + 15; 

console.log(myNumber); 
+4

Non mi dispiace davvero non ricevere la risposta accettata, ma questo in realtà è sbagliato. Non otterrai mai 225, solo fyi – Joe

+1

Dovrebbe essere davvero 'var myNumber = Math.floor (Math.random() * 8);'. –

+0

grazie. Sono corretto. – nosarious

6

Come così

Math.floor(Math.random()*8)*30 + 15 
+2

ottenere questa risposta richiede l'algebra scuola superiore che la maggior parte degli studenti non si aspettano di utilizzare. – zzzzBov

5

come circa usando:

[15, 45, 75, 105, 135, 165, 195, 225][Math.floor(Math.random()*8)] 
+0

Mi piace questo il migliore in base al principio [** KISS **] (http://en.wikipedia.org/wiki/KISS_principle) – qwertymk

+0

, stavo pensando a 'casual.choice (intervallo (15.225 + 1, 30)) 'e questo è il javascript di questo. –

+0

Da dove viene? – qwertymk

0

Ecco una funzione che precomputes tutti i numeri possibili, e in modo casuale restituisce uno.

function getRandomNumber(start, end, increments) { 
    var numbers = []; 
    for(var n = start; n <= end; n += increments) { 
     numbers.push(n); 
    } 

    var randomIndex = Math.floor(Math.random() * numbers.length); 
    return numbers[randomIndex]; 
} 

Usa come,

getRandomNumber(15, 225, 30) 
3

Inizia con la tabella dei valori

x | y 
======= 
0 | 15 
1 | 45 
2 | 75 
3 | 105 
4 | 135 
5 | 165 
6 | 195 
7 | 225 

Impostare l'equazione

y = ax + b 

Plug in alcuni valori iniziali

15 = a(0) + b 

Risolvere per ogni variabile è possibile

15 = b 

collegare diversi valori iniziali

225 = a(7) + 15 

Risolvere per tutte le variabili rimanenti

210 = a(7) 
30 = a 

Ribadire l'equazione

y = 30x + 15 

Randomizza x tra i limiti

x = Math.floor(Math.random() * 8) //0-7 

usare in funzione

function customRandomNumber() { 
    var x; 
    x = Math.floor(Math.random() * 8); 
    return 30 * x + 15; 
} 

Ottenere un numero casuale all'interno di un intervallo con un passo può essere generalizzato nella seguente funzione:

function rand(min, max, step) { 
    var delta, 
     range, 
     rand; 
    if (arguments.length < 2) { 
     max = min; 
     min = 0; 
    } 
    if (!step) { 
     step = 1; 
    } 
    delta = max - min; 
    range = delta/step; 
    rand = Math.random(); 
    rand *= range; 
    rand = Math.floor(rand); 
    rand *= step; 
    rand += min; 
    return rand; 
} 

Quale metterebbe la vostra funzione ione come

rand(15, 225, 30); 

Vorrei anche notare, perché avevo dimenticato circa i possibili problemi limiti, la forma generalizzata si non includere il limite superiore di 225. Questo perché Math.random() restituisce un numero maggiore di, o uguale a zero e inferiore a uno (0 <= Math.random < 1).Se si desidera includere il limite superiore, è sufficiente includere un passo in più nell'intervallo:

rand(15, 255, 30) //will return 15...225 
+0

'y = mx + b' not' y = ax + b' :) – qwertymk

+0

@qwertymk, i nomi delle variabili che si usano in realtà non contano. Avrei potuto scrivere 'foo = fizz * bar + buzz' e ti darebbe gli stessi risultati. L'unica ragione per cui agli studenti viene insegnata la convenzione di 'y = mx + b' è che possiamo dare un nome coerente alle variabili per facilità di riferimento. – zzzzBov

+0

La mia comprensione è che in alcuni paesi, in particolare negli Stati Uniti d'America, 'y = mx + b' è standard, mentre in altri paesi, come quelli nell'Unione europea,' y = ax + b' è standard. In entrambi i casi, non importa. –

Problemi correlati