2015-05-09 10 views
6

Sto provando a fare questa cosa dove genera 7 numeri casuali. Sto usandoCome generare numeri casuali che si sommano a un determinato numero e vengono generati in un intervallo in JavaScript?

function getRandomInt(min, max) { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 

function generateNum(max, thecount) { 
    var r = []; 
    var currsum = 0; 
    for (var i = 0; i < thecount - 1; i++) { 
     r[i] = getRandomInt(15, max - (thecount - i - 1) - currsum); 
     currsum += r[i]; 
    } 
    r[thecount - 1] = max - currsum; 


    return r; 

} 

Questo a volte tornare numeri che sono NaN o superiori a 40 (che deve essere il massimo)

o inferiore a 15 (che deve essere il min) e ancora meno di 0.

esso genera numeri che si aggiungono ad un altro numero casuale che è da qualche parte tra 110 o 150.

Come posso fare è aggiungere fino al numero casuale totale e di essere ancora in un certo intervallo?

+0

Quindi vuoi generare 7 numeri casuali che aggiungono fino a 40? – Downgoat

+0

Sì e no. Voglio generare 7 numeri casuali che si sommano a un altro numero casuale compreso tra 110 e 150. Inoltre ogni numero deve essere compreso tra 15 e 100. – user3756718

+0

Cosa fa invece? Inoltre, non vedo tutti questi requisiti nel codice. C'è altro codice? Per favore vedi http://stackoverflow.com/help/mcve – Paul

risposta

3

Dobbiamo assicurarci che sia possibile avere numeri tali da poter raggiungere il totale minimo e numeri tali che non possiamo superare il totale massimo.

Per ciascun numero, ricalcolare il suo valore minimo e massimo in modo che la somma prevista sia ancora raggiungibile.

function getRandomInt(min, max) { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 

function randomInts(n, min, max, minSum, maxSum) { 
    if (min * n > maxSum || max * n < minSum) { 
     throw 'Impossible'; 
    } 

    var ints = []; 
    while (n--) { 
     // calculate a lower bound for this number 
     // n * max is the max of the next n numbers 
     var thisMin = Math.max(min, minSum - n * max); 
     // calculate an upper bound for this number 
     // n * min is the min of the next n numbers 
     var thisMax = Math.min(max, maxSum - n * min); 

     var int = getRandomInt(thisMin, thisMax); 
     minSum -= int; 
     maxSum -= int; 
     ints.push(int); 
    } 
    return ints; 
} 

Per completezza, vorrei sottolineare ci sono diversi modi possibili si poteva scegliere la distribuzione di probabilità. Questo metodo garantisce almeno che ogni possibile combinazione di numeri interi abbia probabilità diverse da zero.

+2

Una spiegazione per accompagnare il tuo codice sarebbe bella. – Seiyria

+0

@Seiyria, ma non dovremmo scrivere "codice di auto-documentazione"? ;) Spiegazione aggiunta. –

+1

È piuttosto semplice. [Ecco cosa stavo per postare] (http://pastebin.com/aSRjipKC): P – Downgoat