2012-04-13 25 views
18

Sto provando a creare un generatore di numeri casuali che genera numeri casuali tra due numeri. Per esempio, diciamo che voglio generare un numero casuale compreso tra 4 e 10, io voglio che sia in grado di scegliere da qualsiasi numero da 4 - 10. Ecco quello che ho provato:Numero intero casuale Javascript tra due numeri

var randNumMin = 4; 
var randNumMax = 10; 
var randInt = (Math.floor(Math.random() * (randNumMax - randNumMin + 1)) + randNumMin); 

Tuttavia, che non sembra funzionare e ha generato strani numeri casuali che non erano tra 4 e 10, e alcuni iniziavano con 0. Quale sarebbe l'algoritmo corretto per fare questo?

Ecco il codice sto implementando l'algoritmo in:

$(function() { 
    $('#generateRandNums').click(function() { 

     var numCount = document.getElementById("randNumCount").value; 
     var randNumMin = document.getElementById("randNumMin").value; 
     var randNumMax = document.getElementById("randNumMax").value; 

     if (numCount.match(/^[\d]*$/) && randNumMin.match(/^[\d]*$/) && randNumMax.match(/^[\d]*$/)) {  
      if (numCount == "" || randNumMin == "" || randNumMax == "") { 
       alert ("Please fill out all forms then try again."); 

      } else { 
       if (randNumMin>randNumMax) { 
        alert ("Please make sure your first number is smaller than the second, then try again."); 
       } else { 
        if (randNumMin<0) { 
         alert ("Please make sure that you generate a positive number of random numbers, then try again."); 
        } else { 

         if (numCount>1) { 
          var randResult = ("You generated " + numCount + " random numbers between " + randNumMin + " and " + randNumMax + " and got the numbers ") 
          oneNumber = 0; 
         } else { 
          var randResult = ("You generated a random number between " + randNumMin + " and " + randNumMax + " and got the number "); 
          oneNumber = 1; 
         } 
         for (i=0;i<numCount;i++) { 
         //Get a random number between randNumMin and randNumMax 
         var randInt = (Math.floor(Math.random() * (randNumMax - randNumMin + 1)) + randNumMin); 
          if (i == numCount-1) { 
           if (oneNumber == 0) { 
            randResult = (randResult + "and " + randInt + "."); 
           } else { 
            randResult = (randResult + randInt + "."); 
           } 
          } else { 
           randResult = (randResult + randInt + ", "); 
          } 
         } 
         $("#randNumResults").val(randResult); 
        } 
       } 
      } 
     } else { 
      alert ("Make sure you only enter numbers and no spaces, then try again."); 
     } 

    }); 
}); 

Ho anche provato a sostituire la linea randInt con questo:

var randInt = Math.floor((Math.random() * ((randNumMax + 1) - randNumMin)) + randNumMin); 

E ancora non ha funzionato. Non sono sicuro che l'algoritmo sia errato o lo incorporo nella funzione. Una risposta è apprezzata, grazie.

+1

sembra funzionare bene per me. – qw3n

+1

Sembra buono: http://jsfiddle.net/j08691/LYQKV/ – j08691

+0

Aggiungerò la funzione in cui lo sto implementando. –

risposta

2

Il tuo problema è che mai convertito la stringa di numeri prova ad aggiungere questa

if ( numCount.match(/^[\d]*$/) && 
    randNumMin.match(/^[\d]*$/) && 
    randNumMax.match(/^[\d]*$/)){ 
    if (numCount === "" || randNumMin === "" || randNumMax === "") { 
    alert ("Please fill out all forms then try again."); 
    } else { 
    numCount=numCount-0;randNumMin=randNumMin-0;randNumMax=randNumMax-0; 

un'altra nota è necessario modificare il vostro controllo se il valore è una stringa vuota di uguaglianza rigorosa. Per vedere cosa intendo provare a utilizzare zero per uno dei valori. 0 == ""//returns true perché entrambi sono falsi 0 === ""//returns false.

+0

Grazie, quella riga di codice lo ha risolto. Apprezzato. –

+0

Sapresti perché il mio "Assicurati che il primo numero sia più piccolo del secondo numero" Non funziona quando faccio il primo numero, ma zero? –

+0

@JackDavis Non sono sicuro di cosa non funzioni poiché sembra funzionare bene per me. Ecco un esempio di ciò che ho http://jsfiddle.net/YLxPr/. – qw3n

49

Generating random whole numbers in JavaScript in a specific range?

/** 
* Returns a random number between min and max 
*/ 
function getRandomArbitary (min, max) { 
    return Math.random() * (max - min) + min; 
} 

/** 
* Returns a random integer between min and max 
* Using Math.round() will give you a non-uniform distribution! 
*/ 
function getRandomInt (min, max) { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 

http://roshanbh.com.np/2008/09/get-random-number-range-two-numbers-javascript.html

//function to get random number upto m 
function randomXToY(minVal,maxVal,floatVal) 
{ 
    var randVal = minVal+(Math.random()*(maxVal-minVal)); 
    return typeof floatVal=='undefined'?Math.round(randVal):randVal.toFixed(floatVal); 
} 

o

Generate random number between two numbers in JavaScript

+0

Ho provato l'equazione nel collegamento nella funzione nella domanda, e non ha funzionato. –

+0

Non sono sicuro se hai visto la mia risposta aggiornata o no, ma ora ci sono più fonti. Il primo link/codice è presumibilmente del Centro per sviluppatori Mozilla. – Ian

+0

Ho la sensazione che il problema sia dovuto al fatto che non si stanno convertendo le stringhe in int. MA questo può essere evitato usando la funzione getRandomInt() che ho fornito sopra a causa dell'ordine delle operazioni. Poiché completa "max - min" prima di aggiungere "1", il risultato è un int (purché max e min siano numeri validi) ... quindi il resto del calcolo viene eseguito come numeri interi e deve essere accurato. – Ian

1

ne dici di questo?

var max = 10; 
var min = 4; 
var random = Math.floor((Math.random() * ((max + 1) - min)) + min); 
+0

l'ho implementato nella funzione che ho postato nella domanda, e sembrava ancora che non lo fosse lavoro e dammi numeri che erano molto grandi. –

+0

Ho riletto il tuo problema, e questo codice è fondamentalmente lo stesso di quello che hai - solo con qualche parentesi in più per la leggibilità. Non pensare che il problema si trovi nel generatore casuale. – mccambridge

+0

Giusto, l'ho imparato dagli altri commenti. È che non sto convertendo in un intero. –

Problemi correlati