Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Генератор не повторяющихся случайных чисел, кроме... (https://javascript.ru/forum/dom-window/34905-generator-ne-povtoryayushhikhsya-sluchajjnykh-chisel-krome.html)

qwertyuiopoiuytrewq 23.01.2013 19:15

Генератор не повторяющихся случайных чисел, кроме...
 
Есть код, он генерирует случайные не повторяющийся числа, кроме какого/каких - нибудь в данном случае одного, он вроде работает корректно, но почему-то(правда очень редко, гораздо реже, чем без этого условия) генерирует 0, скажите пожалуйста, из-за чего это может быть
var x, a=[], check=0;
function randomize(x) {
a[x]=Math.floor(Math.random()*5);
for(var j=0; j<x; j++){
  if(a[x]==check||a[x]==a[j]){randomize(x)}
}
}
for(var i=0; i<=5; i++){
randomize(i);
}
function test(x){
x.style.display='none';
for(var d=0;d<4;d++){alert(a[d])}}

<div onclick='test(this)' style='display:block'>Begin</div>

рони 23.01.2013 19:52

Дзен-трансгуманист,
как вариант из вашего кода
function rand ( min, max, except ) {
  var number = except;
  while (number == except) {
      number = Math.floor( Math.random() * ( max + 1 - min ) + min );
  }
  return number;
}

var test = [];
while ( test.length < 20 ) {
  test.push( rand( 1, 5, 4 ) ); // от 1 до 5 включительно, но кроме 4
}
alert( test );

Deff 23.01.2013 20:00

Генерируйте через Дата.time()+рандом

qwertyuiopoiuytrewq 23.01.2013 20:04

Спасибо, только хотелось бы понять механизм, почему так происходит, ведь он явно не игнорирует if, но и не всегда его выполняет?

Deff 23.01.2013 20:10

qwertyuiopoiuytrewq,
Хм - Вы же кол-во случайных ограничили и обрубили дробное, почему бы цифрам не повторяться?
У вас 0.2222 == 0.4444444 и тд
Берите более длинные цифры или регуляркой изымите запятушку тады не нужен Math.floor

alert(Math.floor((Math.random()+'').split(".").join(''))%5);

рони 24.01.2013 11:39

Цитата:

Сообщение от Deff
alert(Math.floor((Math.random()+'').split(".").joi n(''))%5);

в этом случае можно без Math.floor
alert((Math.random()+'').split(".").join('')%5);


Часовой пояс GMT +3, время: 08:30.