2014-11-04 5 views
0

Я пытаюсь найти 10 случайных чисел между 100 и 1000, и если любое из чисел равно, то мне нужно, чтобы компьютер выбирал другое случайное число. Кто-нибудь знает как это сделать?Как генерировать ненулевые случайные числа

<script type="text/javascript"> 
     var numbers=[]; 
     var max=110; 
     var min=100; 
     numbers [1]= Math.floor(Math.random() * (max - min + 1)) + min; 
     numbers [2]= Math.floor(Math.random() * (max - min + 1)) + min; 
     numbers [3]= Math.floor(Math.random() * (max - min + 1)) + min; 
     numbers [4]= Math.floor(Math.random() * (max - min + 1)) + min; 
     numbers [5]= Math.floor(Math.random() * (max - min + 1)) + min; 
     numbers [6]= Math.floor(Math.random() * (max - min + 1)) + min; 
     numbers [7]= Math.floor(Math.random() * (max - min + 1)) + min; 
     numbers [8]= Math.floor(Math.random() * (max - min + 1)) + min; 
     numbers [9]= Math.floor(Math.random() * (max - min + 1)) + min; 
     numbers [10]= Math.floor(Math.random() * (max - min + 1)) + min; 


    do (numbers[2]); 

      while (numbers[1]===numbers[2]); 
    do (numbers[3]); 

      while (numbers[1] == numbers[3])  
      (numbers[2] == numbers[3]); 


     for (i in numbers){ 
      document.writeln("<br>"+numbers[i]); 
     } 
    </script> 

ответ

1

использовать этот код:

var numbers = []; 
var max = 110; 
var min = 100; 

while (numbers.length != 10) { 
    var number = Math.floor(Math.random() * (max - min + 1)) + min; 

    var exists = false; 
    for (var i = 0; i < numbers.length; i++) { 
     if (number == numbers[i]) 
      exists = true; 
    } 

    if (!exists) 
     numbers.push(number); 
} 

console.log(numbers); 

jsfiddle

2

Вы можете использовать что-то вроде

<script> 
    var foo = {} 

    while (Object.keys(foo).length < 10) { 
     foo[Math.floor(Math.random() * (max - min + 1)) + min] = true; 
    } 

    var numbers = Object.keys(foo); 
</script> 
+0

Это использует объект для имитации набора, см http://www.javascriptexamples.org/2011/01/17/how -to-implement-a-set-in-javascript/ – user3557327

2
var numbers = []; 
var max = 1000; 
var min = 100; 

while (numbers.length < 10) { 
    var num = Math.floor(Math.random() * (max - min + 1)) + min 
    if(numbers.indexOf(num)!= -1){ 
    numbers.push(num) 
    } 
} 
+0

Обратите внимание, что создание (очень) хорошо распределенных случайных чисел с использованием поплавков практически невозможно. Дело не в том, что ответ неправильный, но не начинайте лотерею, используя это. Также обратите внимание, что 'Math.random()' вряд ли будет криптографически безопасным. –

+0

Eh, не должно превышать 1000? –

+0

@MaartenBodewes Да, не замечал этого. Исправлено. –

1

Вы можете продолжать проверять для повторных чисел, так как в вашем случае они не появляются десять, но я бы использовал случайное семя в этом случае, так как вам не нужно было бы проверять наличие дубликатов.

Все, что вам нужно сделать, это заменить Math.random своей пользовательской случайной функцией и удалить все ненужные в то время как циклы. Пример:

var seed = Math.random(); 
 
var random = function(){ 
 
    return parseFloat('0.'+Math.sin(++seed).toString().substr(6)); 
 
}; 
 
var r = []; 
 
for(var i=0; i < 10; i++){ 
 
    r[i] = random(); 
 
} 
 
document.body.textContent = r.join(' ');

Подробнее о random seeds

+0

Это первый время я вижу, что Math.sin используется для генерации случайных чисел. Насколько это хорошо против Math.random? – user3557327

+0

Это на самом деле трюк ... Я не знаю точно, как ведет себя [распространение] (http://en.wikipedia.org/wiki/Probability_distribution), но на практике он работает как шарм, D !!! Если вы попытаетесь проанализировать его геометрически, это похоже на довольно линейное распределение. – rafaelcastrocouto