Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.04.2013, 01:14
Новичок на форуме
Отправить личное сообщение для DJZT Посмотреть профиль Найти все сообщения от DJZT
 
Регистрация: 16.04.2013
Сообщений: 1

Алгоритм жеребьёвки
Задача написать генератор жеребьёвки для турниров. То есть надо сопоставить первые пары.
Алгоритм таков, что генерируем число от 1 до 16 и проверяем его в массиве arr. Если не найдено - запишем в исключающий массив arr и в массив первых команд в паре mas1.
Аналогично и для вторых команд пары. и так прохожу 16 раз, пока не заполнятся все массивы mas1 mas2.

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

Код:
<div class = "zad">
	<h1>Задача 7</h1>
	<p>Реализовать программу "Генератор жеребьёвки"</p>
	<form name = "inf">
		<input type = "text" value = "16" name = "k_kom">
		<input type = "button" value = "Сгенерировать" 
onClick = "generation()">
	</form>
	<script type="text/javascript">
	
function generation(){
		//debugger;
		var arr = [100, 101];
		var mas1 = [];
		var mas2 = [];
		var ch1 = 0;
		var ch2 = 0;
		var min = 1;
		var max = inf.k_kom.value;
		for(var k = 0;k<=16;k++){
		M1:{
			ch1 = Math.round((Math.random() * (max - min) + min));
			for(var i in arr){
				if(arr[i] == ch1){
					break M1;
				}else{
					arr.push(ch1);
					mas1.push(ch1);
				}
			}
		}
		M2:{
			ch2 = Math.round((Math.random() * (max - min) + min));
			for(var i in arr){
				if(arr[i] == ch2){
					break M2;
				}else{
					arr.push(ch2);
					mas2.push(ch2);
				}
			}

		}
	}
	print(mas1);
	print(mas2);
}
	generation();
</script> </div>
Ответить с цитированием
  #2 (permalink)  
Старый 16.04.2013, 18:02
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

И в чем вопрос?
Надо отладить скрипт и исправить ошибки? Или же подсказать лучшее решение?
Ну для начала скажу, что выбрать случайное число в диапазоне 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 ) ;
то шансы уровняются.
Ответить с цитированием
  #3 (permalink)  
Старый 16.04.2013, 18:19
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Вот вам алгоритм:
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" ) );

Последний раз редактировалось rgl, 16.04.2013 в 18:23.
Ответить с цитированием
  #4 (permalink)  
Старый 16.04.2013, 20:56
Профессор
Отправить личное сообщение для dima*** Посмотреть профиль Найти все сообщения от dima***
 
Регистрация: 13.12.2012
Сообщений: 283

DJZT-а тебе для чего?
Просто,есть файл в excel,где есть календари на любое количество команд.Просто,вписываешь название команд и календарь готов.Или тебе другое нужно?

Последний раз редактировалось dima***, 16.04.2013 в 22:50.
Ответить с цитированием
  #5 (permalink)  
Старый 16.04.2013, 21:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,078

Вариант...
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"))

Последний раз редактировалось рони, 17.04.2013 в 08:26.
Ответить с цитированием
  #6 (permalink)  
Старый 17.04.2013, 00:11
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

рони,
!!!!!!!!!!!!!!!!!!!!!!!!!!!
Хотя......
Ответить с цитированием
  #7 (permalink)  
Старый 17.04.2013, 00:31
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от rgl Посмотреть сообщение
рони,
Хотя......
Что-то мне в этом не понравилось, что-то подсказывало что шансы не равны. Несложный эксперимент показал, что всегда на последнем месте 16, т.е. интуиция не подвела. В любом случае респект за оригинальность
Ответить с цитированием
  #8 (permalink)  
Старый 17.04.2013, 01:08
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от рони Посмотреть сообщение
Вариант...
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"))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как написать алгоритм выборки в javascript? Isaac Общие вопросы Javascript 13 06.02.2013 11:15
Волновой алгоритм Ли с 8-ми направлениями boy_cow Общие вопросы Javascript 6 04.10.2012 21:08
алгоритм шифрования DES brizzzobot Общие вопросы Javascript 3 25.04.2012 15:49
Спецификация Ecma-262. Пункт 8.7.2 PutValue(V,W) не до конца ясен алгоритм. vandy3 Общие вопросы Javascript 0 09.01.2012 17:31
алгоритм изменения насыщенности цвета bushstas Оффтопик 3 22.03.2011 23:58