PDA

Просмотр полной версии : Настраиваемый генератор случайных чисел


HardCoder
03.06.2012, 13:49
Здравствуйте! Встречал ли кто-нибудь алгоритм, который случайно выдает одну из (например пяти) цифр, но при этом его можно настроить? Например, задать ему (этому классу или методу), чтобы число 5 выпадало чаще или реже, а число 2 выпадало реже или чаще и т.д. Может, даже, задавать коэффициент вероятности выпадения того, или иного числа. Или подскажите, пожалуйста, как такое сделать.

Партизан
03.06.2012, 14:17
Обычно ищут случайность, а вы наоборот :)

В массив загоните числа которые нужны... например

var arr:Array = [1,2,2,2,2,2,2,2,3,4,5,5,5,5]
trace(arr[uint(Math.random() * arr.length)])

wvxvw
03.06.2012, 14:27
Math.random() < 0.5 случается в 50% случаев, Math.random() < 0.1 случается в 10% случаев. По крайней мере должно быть так. Но для криптографии флешевый рандом, например, не подходит, т.как недостаточно информации в одном запросе. Очень часто для криптографии нужно больше 52 битов. Имитировать /dev/urandom можно примерно таким же способом, как устроен и сам urandom - т.е. копированием "шума" не имеющего цикличности - чего-нибудь связанного с действиями пользователя, например, смещение мышки, нажатые клавиши, разницу между системным временем и предполагаемым идеальным временем вызова таймера по которому рандом обновляется, конечно же, такой рандом лучше хранить на машине пользователя, для лучшей последовательности.
Естественно, каждое обращение к рандому должно генерировать его по-новому.

Партизан
03.06.2012, 14:46
wvxvw, чет я вашей мысли не уловил... применимо к задаче...

HardCoder
03.06.2012, 14:50
Спасибо за ответы.
Партизан, вы показали как выбрать случайное число из некоторого диапазона чисел, но в этом проблема не стоит.
wvxvw, ничего не понял, но что-то подсказывает мне, что вы показали как сымитировать случайное число вручную.
К сожалению интересует другое:
Есть 5 чисел:var numbs:Array = [0, 1, 2, 3, 4];Берем 10 попыток сгенерировать число. Флешевский рэндом выведет: 2, 4, 0, 3, 0, 1, 1, 2, 4, 3 (цифры взяты из головы).
Нужно, чтобы, например, число "2" в среднем выводилось в 2 раза чаще остальных: 1, 2, 4, 2, 3, 4, 2, 0, 1, 2.
Возможно ли создать такой, алгоритм, в котором можно задать, чтобы некоторое число выводилось чаще остальных? И если да, то как?

КорДум
03.06.2012, 14:54
Так расширьте исходный массив так, как показал Партизан. И делайте рандомную выборку уже оттуда.

artcraft
03.06.2012, 14:55
например должны выпадать числа от 1 2 и 3 причём 3 должен выпадать в два раза чаще чем 1 и 2

var rnd:Number = Math.random();
if(rnd > .5) return 3;
if(rnd > .25) return 2;
return 1;

если нужно настраивать вероятности на лету,
то принцип точно такой только циклом

HardCoder
03.06.2012, 15:25
Так расширьте исходный массив так, как показал Партизан. И делайте рандомную выборку уже оттуда.Не заметил, что в Партизана в массиве больше двоек :) Хороший способ. Наглядно видно какие числа будут чаще выпадать.
artcraft, если придется выбирать среди 10-ти 20-ти чисел - будет много писанины и много вручную производить подсчеты. Тоесть, для каждого числа из 20-ти придется выбирать диапазон и сравнивать...
Спасибо всем.

artcraft
03.06.2012, 15:37
"будет много писанины" пф...


trace( pseudoRandom( [['apple', 1], ['lemon', 1], ['cherry', 2]] ) );
// 25% - яблоко, 25% - лимон, 50% - вишня


trace( pseudoRandom( [['apple', .1], ['lemon', .1], ['cherry', 1000]] ) );
// почти всегда вишня, но есть минимальный шанс словить яблоко или лимон


private function pseudoRandom(data:Array):*{
var sum:Number = 0, n:Number = 0, i:Array, r:Number = Math.random();
for each(i in data) { sum += i[1]; }
for each(i in data) { n += i[1] / sum; if (r <= n) return i[0];}
return null;
}

если надо еще 20 фруктов просто добавьте их в массив

Добавлено через 30 минут
методом который предлагает партизан будет трудно организовать шанс 1 : 100000000 или 1 : 0.0697602774
а вот моей функцией запросто

wvxvw
03.06.2012, 16:46
[redacted]

Упс, не туда посмотрел, я не сразу понял, как сума считается, сорри.

artcraft
03.06.2012, 16:53
так там так и есть, сперва высчитывается сумма всех шансов, и приводится к доле от единицы
шанс / все шансы

wvxvw
03.06.2012, 16:54
Да-да, сорри, я не понял сразу как сума считается. Поправил комментарий.