Алгоритм жеребьёвки
Задача написать генератор жеребьёвки для турниров. То есть надо сопоставить первые пары.
Алгоритм таков, что генерируем число от 1 до 16 и проверяем его в массиве arr. Если не найдено - запишем в исключающий массив arr и в массив первых команд в паре mas1. Аналогично и для вторых команд пары. и так прохожу 16 раз, пока не заполнятся все массивы mas1 mas2. В исключающий массив arr пишет всё подряд без разбора, хоть оно даже там и есть уже. Код:
<div class = "zad"> |
И в чем вопрос?
Надо отладить скрипт и исправить ошибки? Или же подсказать лучшее решение? Ну для начала скажу, что выбрать случайное число в диапазоне min - max нужно не так. Ваш алгоритм плохой, т.к. вероятность выпадения min или max в два раза меньше, чем других чисел. Вот, взгляните:
var min = 1, max = 10, r, i, rCount = Array(max-min+1);
for( i = 0; i < rCount.length; ++i )
rCount[i] = 0;
for( i = 0; i < 100000; ++i ) { // считаем количество выпадений
r = Math.round((Math.random() * (max - min) + min));
++rCount[ r - min ];
}
for( i = 0; i < rCount.length; ++i ) // считаем вероятности
rCount[i] /= 100000;
alert( rCount );
А вот если вместо Math.round((Math.random() * (max - min) + min)) ; написать Math.floor( Math.random() * (max-min+1) + min ) ; то шансы уровняются. |
Вот вам алгоритм:
var min = 1, max = 16, r, i, tmp, mas = Array(max-min+1);
for( i = 0; i < mas.length; ++i ) // заполняем массив номерами команд
mas[i] = i+min;
for( i = 0; i < mas.length; ++i ) { // тасуем
r = Math.floor( Math.random() * (max-min+1) );
tmp = mas[i];
mas[i] = mas[r];
mas[r] = tmp;
}
// Внимание, нет никакой защиты на случай, если количество команд нечетное.
for( i = mas.length - 2; i >= 0; i -= 2 ) // группируем попарно
mas.splice( i, 2, [ mas[i], mas[i+1] ] );
alert( mas.join( "\n" ) );
|
DJZT-а тебе для чего?
Просто,есть файл в excel,где есть календари на любое количество команд.Просто,вписываешь название команд и календарь готов.Или тебе другое нужно? |
Вариант...
var max = 16, arr = [];
max++;
while (--max) {
var i = arr.length;
var num = Math.floor(Math.random() * (++i));
arr.splice(num, 0, max);
}
alert(arr.join(",").match(/\d+,\d+/g).join("\n"))
|
рони,
!!!!!!!!!!!!!!!!!!!!!!!!!!! Хотя...... |
Цитата:
|
Цитата:
var max = 16, arr = [];
max++;
while (--max) {
var i = arr.length;
var num = Math.floor(Math.random() * (i+/*!!!!!!!!*/1));
arr.splice(num, 0, max);
}
alert(arr.join(",").match(/\d+,\d+/g).join("\n"))
|
| Часовой пояс GMT +3, время: 02:44. |