![]() |
|
||||||||||
|
|
|
|||||
|
Цитата:
public function Main():void { trace(test(-3));// 0,1660,1706,1649,1651,1652,1682 trace(test(0));// 1693,1650,1720,0,1611,1633,1693 trace(test(3));// 1642,1608,1681,1662,1702,1705,0 } private function test(exept:int):Array { var res:Array = [0, 0, 0, 0, 0, 0, 0]; var n:int = 1e4; for (var i:int = 0; i < n; i++) { res[3 + random( -3, 3, exept)]++; } return res; } public function random(min:int, max:int, except:int):int { if (Math.random() < (except - min) / (max - min)) { return min + int(Math.random() * (except - min)); } else { return max - int(Math.random() * (max - except)); } } |
|
|||||
|
Modus ponens
|
Тут очень много зависит от того, что именно вы называете случайным числом. Фишка в том, что ни один из приведенных выше примеров скорее всего не пройдет diehard test, не смотря на то, что число, вобщем-то будет "случайным".
Вариант о котором я думал: выбирать случайно из двух диапазонов: min<exclude и exclude>max - но это расточительно, если нужно часто радном генерировать. А можно полюбопытствовать, зачем это понадобилось, и на скольк важна правильная (взвешенная) рандомность? silin: О, я твой вариант не видел, когда писал, я вот тоже о чем-то таком думал, только не нужно два раза random() вызывать. Если закешировать первый вызов и им и воспользоваться, то и дешевле выйдет и больше вероятность, что в итоге распределение будет правильным.
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 29.01.2012 в 20:03. |
|
|||||
|
>> выбирать случайно из двух диапазонов: min<exclude и exclude>max - но это расточительно
ровно на один Math.random(), едва ли не дешевле, чем другие выверты а насчет diehard test, что-то не могу такой задачки для флеша вообразить даже |
|
|||||
|
Modus ponens
|
Ну тут не только то, что дешевле, вовсе не факт, что Math.random() * Math.random() дают правильное распределение - надо тестировать.
А по поводу diehard тестов я не понял замечание - это как бы тесты для любого рандома, на чем хочешь пиши - они тестируют распределение. Т.е. есть определенные требования к равномерному распределению, например, проблема дня рождения (если предположить что вероятность того, что любой день в году может быть днем рождения кого-то из участников группы - нужно определенное количество человек для того, чтобы вероятность достигла определенного процента). Ну вот если бы приведенный алгоритм проверили таким тестом и получилось бы что вероятность 50% наступает не в группе из 10 человек, а из 5, то это значило бы, что алгоритм плохой (существуют коллизии) - ну а дальше уже, смотря для чего использовать. Если для игры в покер - то плохо, если выбрать в какой случайный цвет покрасить текст на открытке - то без разницы ![]()
__________________
Hell is the possibility of sanity |
|
|||||
|
про diehard test понятно, непонятно какое это имеет отношение к сабжу,
Math.random() сам-то проходит? ![]() если уровня Math.random() достаточно, то сгодится и то, что наворачивается на его базе, никаких сюрпризов с измением 50%-ной группы вдвое не ожидается, ну во всяком случае в варианте с диапазонами (№19) |
|
|||||
|
Modus ponens
|
Нет, нет такой зависимости. мы же не знаем точно какая реализация. Ксор-шифт рандом * ксор-шифт рандом, например, не пройдет. Math.random() заявлен как взвешеный рандом - значит должен, но я не проверял. По тем результатам которыми приходилось пользоваться - вроде прходит. Но нет такой гарантии, что композиция одной функции генерации взвешенного рандома с самой даст опять же взвешенный рандом. Ее по определению не может быть
![]() ЗЫ. Там где звездочка имеется в виду не умножение а сложение функций, типа \circ в Латексе.
__________________
Hell is the possibility of sanity |
|
|||||
|
fish_r, теоретически такой код может уйти в бесконечную рекурсию. Чем больше разброс, тем вероятность меньше.
И кстати, даже если отбросить рекурсию - считать будет не правильно. Upd. Да, правильно считает, посмотрел не туда.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! Последний раз редактировалось TanaTiX; 30.01.2012 в 06:35. |
|
|||||
|
Modus ponens
|
public function random(min:int, max:int, except:int):int { var random:Number = Math.random(); if (random < (except - min) / (max - min)) { return min + int(random * (except - min)); } else { return max - int(random * (max - except)); } } ![]()
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 30.01.2012 в 17:11. |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:19. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| random |
| Опции темы | |
| Опции просмотра | |
|
|