2013-03-23 2 views
3

Я пытаюсь сделать игру в бинго для удовольствия. Я смотрел во многих местах для уникального генератора, но я не могу найти его. Я пытался сделать свой собственный, но как только он на самом деле набирает число, это то же самое, что и бесконечный цикл. Я пробовал простой код, который теоретически должен работать, но по какой-то причине все проходит. Что я могу сделать!?Уникальный генератор случайных чисел Javascript

var bc = []; 
for (var i = 0; i < 5; i++) { 
    var r = Math.floor(Math.random()*20+1) + 0; 
    if(!(r in bc)){ 
    bc.push(r);  
    } 
    else 
    { 
    i--; 
    } 
} 
____________________________________________ 
____________________________________________ 
____________________________________________ 
b1=0; 
b2=0; 
b3=0; 
b4=0; 
b5=0; 
var bc = [b1,b2,b3,b4,b5] 
var bnc = function(){ 
    var n = Math.floor(Math.random() * 5+1)+0; 
    var n2 = Math.floor(Math.random() * 5+1)+0; 
    b1 = n; 
    var a1 = true; 
    var as = false; 
    while(a1){ 
     var c = n; 
     if(c===b1||c===0 ||as!==false){ 
     c = n2; 
     as=true; 
     } 
     if(c===b1||c===0&&as===true){ 
     c = n; 
     as=false; 
     } 
      if(c!=b1){ 
      b2 = c; 
      a1 = false; 
      a2 = true; 
     } 
    } 
}; 
bnc(); 
console.log("new1"); 
console.log(b1,b2,b3,b4,b5); 
//_______________________________________ 
var bnc2 = function(){ 
    var n = Math.floor(Math.random() * 5+1)+0; 
    var n2 = Math.floor(Math.random() * 5+1)+0; 
    var a1 = true; 
    var as = false; 
    while(a1){ 
     var c = n; 
     if(c===b1||c===b2||c===0&&as===false){ 
     c = n2; 
     as=true; 
     } 
     if(c===b1||c===b2||c===0&&as===true){ 
     c = n; 
     as=false; 
     } 
     if(c!=b1&&c!=b2){ 
      b3 = c; 
      console.log("made it 1"); 
      a1 = false; 
     } 
    } 
}; 
bnc2(); 
console.log("new2"); 
console.log(b1,b2,b3,b4,b5); 
+0

Это не было бы совершенно неправильно с некоторыми комментариями и/или описанием того, что функции должны делать, начиная с его большого количества кода. Вы хотите создать последовательность уникальных случайных? Кажется, что это много кода для этого ... – apelsinapa

+0

Вы можете легко адаптировать один из этих ответов, если вам нужно уникальное случайное число: http://stackoverflow.com/questions/105034/how-to-create-a- guid-uuid-in-javascript – Kane

+0

Подсказка о вашем первом цикле 'for': оператор' in' не делает то, что вы думаете (он проверяет имена свойств, а не значения свойств). – nnnnnn

ответ

3

я предпочел бы сделать это с чем-то вроде этого:

http://jsfiddle.net/YC58s/

generate = function(length) 
{ 
    var arr = []; 
    var n; 
    for(var i=0; i<length; i++) 
    { 
     do 
      n = Math.floor(Math.random()*20+1); 
     while(arr.indexOf(n) !== -1) 

     arr[i] = n; 
    } 

    return arr; 
} 
+0

Не могли бы вы объяснить, как это работает. Я получаю цикл, возврат, vars, но оператор while. Как это работает, почему он не повторяет? –

+1

@TrentBraswell цикл while - это do/while. Это означает, что он выполнит оператор inline и установит n на случайное число, прежде чем проверять критерий. Критерий оценивает, есть ли такое значение в массиве. indexOf (n) возвращает целочисленный ключ для значения n, если он существует в массиве, иначе он возвращает -1. Таким образом, запуск цикла снова, если indexOf не возвращает -1. – apelsinapa

8

, когда он на самом деле попадает в число, которое тот же

Он никогда не должен. Такие алгоритмы take longer the longer they run. Вы должны принять другой подход:

Поместите все возможные номера в бассейн. Как только вы нарисуете номер, удалите его из пула. Так же, как в реальной жизни.

var pool = [1, 2, 3, 4, 5]; 
var getNumber = function() { 
    if (pool.length == 0) { 
     throw "No numbers left"; 
    } 
    var index = Math.floor(pool.length * Math.random()); 
    var drawn = pool.splice(index, 1); 
    return drawn[0]; 
}; 
-1
window.onload = unRanNumGen(20, 1, 12); 
    //above, we need 12 random numbers between 20 (included) and 1(included) 

function unRanNumGen(max, min, limit){ 

    //max = maximum number [inclued] (range of numbers) 
    //min = minimum number [included] (range of numbers) 
    //limit = number of random numbers (how many numbers do you want?) 

    var pool = [genRan(max, min)]; 

    for(i=0; i<limit; i++){ 
     for(n = 0; n <i; n++){ 

      if(pool[n] !== genRan(max, min)){ 
      pool.push(genRan(max, min)); 

      break; 
      } 
     } 

    } 

function genRan(max, min){ 
    var genRan = Math.floor(Math.random() * (max - min) + min); 
    return genRan; 
} 

alert(pool.join('\n')); //to display the array of random numbers 

} 
0

Это может обрабатывать генерации ДО 20 цифр UNIQUE случайного числа

JS

var generatedNumbers = []; 

function generateRandomNumber(precision) { // precision --> number precision in integer 
    if (precision <= 20) { 
     var randomNum = Math.round(Math.random().toFixed(precision) * Math.pow(10, precision)); 
     if (generatedNumbers.indexOf(randomNum) > -1) { 
      if (generatedNumbers.length == Math.pow(10, precision)) 
       return "Generated all values with this precision"; 
       return generateRandomNumber(precision); 
     } else { 
      generatedNumbers.push(randomNum); 
      return randomNum; 
     } 
    } else 
     return "Number Precision shoould not exceed 20"; 
} 
generateRandomNumber(1); 

enter image description here

JsFiddle

Смежные вопросы