Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Настраиваемый генератор случайных чисел (http://www.flasher.ru/forum/showthread.php?t=180449)

HardCoder 03.06.2012 13:49

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

Партизан 03.06.2012 14:17

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

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

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 чисел:
Код AS3:

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

Код AS3:

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

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

HardCoder 03.06.2012 15:25

Цитата:

Сообщение от КорДум (Сообщение 1082676)
Так расширьте исходный массив так, как показал Партизан. И делайте рандомную выборку уже оттуда.

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

artcraft 03.06.2012 15:37

"будет много писанины" пф...

Код AS3:

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]

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


Часовой пояс GMT +4, время: 14:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.