17.03.2016, 21:46
|
Новичок на форуме
|
|
Регистрация: 16.03.2016
Сообщений: 4
|
|
Модернизация рандома простыми приёмами
Здравствуйте.
Недавно начал заниматься 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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Сообщение от EvKLaZ
|
более равновероятный рандом
|
а что это?
Сообщение от EvKLaZ
|
В приложенном фото разъяснено "что" да "как".
|
не осилил
Сообщение от EvKLaZ
|
вдруг кому пригодится.
|
а что код делает?
|
|
18.03.2016, 09:48
|
Новичок на форуме
|
|
Регистрация: 16.03.2016
Сообщений: 4
|
|
Из заданного набора происходит рандом каждого по отдельности элемента, а после, из прошедших предыдущий раунд элементов, выбирается финальное число.
Пришла такая мыль после использования простого приёма Math.floor(Math.random()), где не устраивала его максимальная вероятность выпада чисел по середине.
|
|
18.03.2016, 10:37
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
EvKLaZ,
а можно как-то по проще обьяснить или какую-то статистику показать?
Сообщение от EvKLaZ
|
не устраивала его максимальная вероятность выпада чисел по середине.
|
а какая была вероятность до того и какая стала после?
|
|
18.03.2016, 18:51
|
Новичок на форуме
|
|
Регистрация: 16.03.2016
Сообщений: 4
|
|
рони,
вот небольшая статистика.
Провёл небольшой тест на игре 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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
EvKLaZ,
замечательно раз вам этот код помогает, но я не осилил ваших обьяснений и алгоритма который вы хотели достичь, можно не продолжать, наверно нельзя обьять необьятное
|
|
18.03.2016, 20:46
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
А какой период повторения? Являютя ли значения независимыми и образуют ли они выборку? Если да, то какому закону распределения она подчинена? Никакой алгоритм не может генерировать полностью случайные числа, он может только аппроксимировать некоторые их свойства. То что вы проверили на 5 примерах никакой ценной информации в себе не несет. Нужно строить некие статиски типо хи-квадрат, проверять различные гипотезы о законе распределения и так далее.
|
|
19.03.2016, 08:22
|
Новичок на форуме
|
|
Регистрация: 16.03.2016
Сообщений: 4
|
|
рони,
спасибо, что уделили время .
destus,
я понимаю, что вы хотите, но я не менял алгоритм самой функции Math.random(). Я просто добавил элемент, который из предложенного количества чисел делает выборку, используя ту же самую Math.random(). Для необходимой мне цели это показалось более подходящим вариантом.
|
|
|
|