![]() |
Случайное число с исключением
Доброго дня.
Мне нужно получить случайное число в заданном диапазоне (ес-но функцией), но с исключением какого-либо числа, т.е. например любое число от 1 до 10, но только не 5. (1,2,3,4,6,7,8,9,10)... Имеется переменная в которой храниттся число исключение - idgame:int, также имеется функция рандома которая выдает случайное число в заданном диапазоне, а как сделать то что мне нужно - прошу помочь. Спасибо. Функция рандома: Код AS3:
|
Первый, плохой, но рабочий вариант:
Код AS3:
Еще вариант: Код AS3:
Ждем более изящных решений :) |
Спасибо большое :)
|
Код AS3:
|
Код AS3:
|
-De-, только что наваял такой же вариант. Тольео для 2-го случая поправь возвращаемое значение на int, и в расчетах тоже, там Number не нужен.
|
Код AS3:
|
-De-, TanaTiX – А что, ситуации когда ex == max исторически исключаются?)
|
но самый прикольный напишет 2wvxvw, если конечно заглянет в тему )
|
Wolsh, тогда необходима либо дополнительная проверка, либо теряется равномерность рэндома (с учетом всех его недостатков во флеше)
fish_r, +1 :) |
С целочисленными без циклов можно так:
Код AS3:
Код:
[10]: 480 |
Цитата:
|
HardCoder, если погуглить, то можно найти информацию о том, что рэндом во флеше... Скажем так, не на столько случайный, как хотелось бы. Хотя для флеша это практически роли не играет. Я это добавил только справедливости ради.
|
Wolsh, нет не исключаются. Для них условие по идее никогда не выполнится. Т.к. Math.random() никогда не равен 1 (см. доки). Хотя возможно при каких-то значениях min и max и максимальном Math.random() выражение Math.random() * (max - min) + min будет равно max из-за ошибок округления =)
TanaTiX опс, перепутал тела функций 0_0 |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Еще у этого алгоритма одно из чисел диапазона никогда не выдается в первой десятке результатов, что прискорбно(( Добавлено через 27 минут Сама идея замены совпадения с исключением на сознательно негенерируемый max весьма элегантна. Претензия только к тому, что поведение при таких параметрах "удивляет", то есть не соответствует ожидаемому. |
такой еще вариант до кучи )
Код AS3:
|
Тут очень много зависит от того, что именно вы называете случайным числом. Фишка в том, что ни один из приведенных выше примеров скорее всего не пройдет diehard test, не смотря на то, что число, вобщем-то будет "случайным".
Вариант о котором я думал: выбирать случайно из двух диапазонов: min<exclude и exclude>max - но это расточительно, если нужно часто радном генерировать. А можно полюбопытствовать, зачем это понадобилось, и на скольк важна правильная (взвешенная) рандомность? silin: О, я твой вариант не видел, когда писал, я вот тоже о чем-то таком думал, только не нужно два раза random() вызывать. Если закешировать первый вызов и им и воспользоваться, то и дешевле выйдет и больше вероятность, что в итоге распределение будет правильным. |
>> выбирать случайно из двух диапазонов: min<exclude и exclude>max - но это расточительно
ровно на один Math.random(), едва ли не дешевле, чем другие выверты а насчет diehard test, что-то не могу такой задачки для флеша вообразить даже |
Ну тут не только то, что дешевле, вовсе не факт, что Math.random() * Math.random() дают правильное распределение - надо тестировать.
А по поводу diehard тестов я не понял замечание - это как бы тесты для любого рандома, на чем хочешь пиши - они тестируют распределение. Т.е. есть определенные требования к равномерному распределению, например, проблема дня рождения (если предположить что вероятность того, что любой день в году может быть днем рождения кого-то из участников группы - нужно определенное количество человек для того, чтобы вероятность достигла определенного процента). Ну вот если бы приведенный алгоритм проверили таким тестом и получилось бы что вероятность 50% наступает не в группе из 10 человек, а из 5, то это значило бы, что алгоритм плохой (существуют коллизии) - ну а дальше уже, смотря для чего использовать. Если для игры в покер - то плохо, если выбрать в какой случайный цвет покрасить текст на открытке - то без разницы :) |
про diehard test понятно, непонятно какое это имеет отношение к сабжу,
Math.random() сам-то проходит? :) если уровня Math.random() достаточно, то сгодится и то, что наворачивается на его базе, никаких сюрпризов с измением 50%-ной группы вдвое не ожидается, ну во всяком случае в варианте с диапазонами (№19) |
Нет, нет такой зависимости. мы же не знаем точно какая реализация. Ксор-шифт рандом * ксор-шифт рандом, например, не пройдет. Math.random() заявлен как взвешеный рандом - значит должен, но я не проверял. По тем результатам которыми приходилось пользоваться - вроде прходит. Но нет такой гарантии, что композиция одной функции генерации взвешенного рандома с самой даст опять же взвешенный рандом. Ее по определению не может быть :)
ЗЫ. Там где звездочка имеется в виду не умножение а сложение функций, типа \circ в Латексе. |
Цитата:
А мой способ ни когда не вернет max - косяк ) За то такой удобно использовать когда требуется исключить сразу ряд чисел-исключений: Код AS3:
|
fish_r, теоретически такой код может уйти в бесконечную рекурсию. Чем больше разброс, тем вероятность меньше.
И кстати, даже если отбросить рекурсию - считать будет не правильно. Upd. Да, правильно считает, посмотрел не туда. |
Проверил, вродь правильно считает. Ну, да - не для сложных случаев, для простых задач, коих тоже хватает пойдет ).
Добавлено через 11 минут Хотя ты прав - потенциальный косячок тут заложен, не стал бы его юзать. |
Цитата:
Код AS3:
|
Цитата:
|
Код AS3:
|
fish_r а у массива есть свойство indexOf ? или я что то не так понял...
|
|
угу вижу. просто никогда не пользовался
|
Цитата:
Код AS3:
|
Тест на скорость и качество рандома, брались целые числа от 0 до 30 включительно, исключалось 5
Код AS3:
Код AS3:
|
2й вариант в тесте будет еще быстрее, если его нормально записать
Код AS3:
|
Алгоритм раздачи случайного бонуса и т.п. :)
Я решал этот алгоритм по другому - создавался массив доступных чисел и потом удалялся случайный элемент. Массив может жить долго с объектом и нет необходимости помнить какие числа надо игнорировать :) |
А можно и рекурсией
Код AS3:
|
Цитата:
|
Цитата:
но ведь работает |
| Часовой пояс GMT +4, время: 23:44. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.