Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Модернизация рандома простыми приёмами (https://javascript.ru/forum/project/61952-modernizaciya-randoma-prostymi-prijomami.html)

EvKLaZ 17.03.2016 21:46

Модернизация рандома простыми приёмами
 
Здравствуйте.:victory:
Недавно начал заниматься js, поэтому опыта немного (совсем немного). Но, выполняя одно задание, захотелось создать более равновероятный рандом. Пришла идея добавить ещё один уровень проверки. В приложенном фото разъяснено "что" да "как".
Скрипт работает. Хотелось бы узнать мнение о возможном сокращении строк, а также вдруг кому пригодится.
<meta charset = "utf8">
<script>
	var arr = [];
	var sum = 0;
	var sum1 = 0;
	reg = 0;
	for( var i = 0; i < 8; i++) {
		arr[i] = Math.round(Math.random());
		if (arr[i] == 1) {
			sum++;
		}
	}
	sum1 = Math.floor(Math.random() * (sum + 1));
	for( var i = 0; i < 8; i++) {
		if( arr[i] == 1 ) {
			sum1--;
		}
		if( sum1 == 0) {
			reg = i;
			break;
		}
	}
	alert(reg);
</script>

рони 17.03.2016 23:54

Цитата:

Сообщение от EvKLaZ
более равновероятный рандом

а что это?
Цитата:

Сообщение от EvKLaZ
В приложенном фото разъяснено "что" да "как".

не осилил
Цитата:

Сообщение от EvKLaZ
вдруг кому пригодится.

а что код делает?

EvKLaZ 18.03.2016 09:48

Из заданного набора происходит рандом каждого по отдельности элемента, а после, из прошедших предыдущий раунд элементов, выбирается финальное число.
Пришла такая мыль после использования простого приёма Math.floor(Math.random()), где не устраивала его максимальная вероятность выпада чисел по середине.

рони 18.03.2016 10:37

EvKLaZ,
а можно как-то по проще обьяснить или какую-то статистику показать?
Цитата:

Сообщение от EvKLaZ
не устраивала его максимальная вероятность выпада чисел по середине.

а какая была вероятность до того и какая стала после?

EvKLaZ 18.03.2016 18:51

рони,
вот небольшая статистика.
Провёл небольшой тест на игре BlackJack с выдачей две карты игроку, а одну дилеру (да, это GeekBrains).
Цель: за 10 раундов необходимо выпадание минимум по разу каждой карты (6, 7, 8, 9, 10, J, Q, K, A).
Каждый скрипт испытывался по 5 раз.
В результате:
- новый рандом: из 5 один раз не выпала одна карта, закрытие происходило на 9, x 7, 8, 9 раунды;
- Math.floor(Math.random()): из 5 три раза не выпала одна карта, закрытие происходило на x, x, 6, x 9 раунды.
Замечу также, что при Math.floor(Math.random()) не было ни разу замечено (ни до теста, ни после), чтобы все три карты были одной величины. Также две карты одной величины выпадали чаще у нового рандома

рони 18.03.2016 19:18

EvKLaZ,
замечательно раз вам этот код помогает, но я не осилил ваших обьяснений и алгоритма который вы хотели достичь, можно не продолжать, наверно нельзя обьять необьятное :)

destus 18.03.2016 20:46

А какой период повторения? Являютя ли значения независимыми и образуют ли они выборку? Если да, то какому закону распределения она подчинена? Никакой алгоритм не может генерировать полностью случайные числа, он может только аппроксимировать некоторые их свойства. То что вы проверили на 5 примерах никакой ценной информации в себе не несет. Нужно строить некие статиски типо хи-квадрат, проверять различные гипотезы о законе распределения и так далее.

EvKLaZ 19.03.2016 08:22

рони,
спасибо, что уделили время:) .
destus,
я понимаю, что вы хотите, но я не менял алгоритм самой функции Math.random(). Я просто добавил элемент, который из предложенного количества чисел делает выборку, используя ту же самую Math.random(). Для необходимой мне цели это показалось более подходящим вариантом.


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