Форум 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=174559)

i.o. 29.01.2012 10:07

С целочисленными без циклов можно так:
Код AS3:

/**
 *  min < max;
 *  min <= excluded
 *  min <= result < max
 */

function randomInt( min:int, max:int, excluded:int ) : int
{
        var r:int = min + (max - min - 1) * Math.random();
        return r + int(r >= excluded);
}
 
 
var matches:Array = new Array();
var i:int = 10000;
while (i--)
{
        var j:int = randomInt(10, 30, 13);
        if (matches[j] === undefined)
                matches[j] = 0;
        else
                matches[j]++;
}
 
for (i=10; i < 30; i++)
{
        trace("[" + i + "]: " + matches[i]);
}

Код:

[10]: 480
[11]: 489
[12]: 521
[13]: undefined
[14]: 513
[15]: 511
[16]: 548
[17]: 525
[18]: 546
[19]: 569
[20]: 523
[21]: 571
[22]: 492
[23]: 550
[24]: 495
[25]: 534
[26]: 544
[27]: 527
[28]: 547
[29]: 496


HardCoder 29.01.2012 10:55

Цитата:

Сообщение от TanaTiX (Сообщение 1059725)
[b]теряется равномерность рэндома (с учетом всех его недостатков во флеше)

А можно подробнее о недостатках?

TanaTiX 29.01.2012 11:24

HardCoder, если погуглить, то можно найти информацию о том, что рэндом во флеше... Скажем так, не на столько случайный, как хотелось бы. Хотя для флеша это практически роли не играет. Я это добавил только справедливости ради.

-De- 29.01.2012 11:50

Wolsh, нет не исключаются. Для них условие по идее никогда не выполнится. Т.к. Math.random() никогда не равен 1 (см. доки). Хотя возможно при каких-то значениях min и max и максимальном Math.random() выражение Math.random() * (max - min) + min будет равно max из-за ошибок округления =)
TanaTiX
опс, перепутал тела функций 0_0

HardCoder 29.01.2012 12:32

Цитата:

Сообщение от TanaTiX (Сообщение 1059736)
HardCoder, если погуглить, то можно найти информацию о том, что рэндом во флеше... Скажем так, не на столько случайный, как хотелось бы.

Я свой вопрос задал, потому что люблю, когда вещи называют своими именами. Очень режет слух слишком смелые высказывания о том, что когда Math.random() выдает не то что хочет видеть человек - называть его "не слишком случайным". Если нужно 10 раз получить случайное число в диапазоне от 0 до 3, рэндом 7 раз может вывести 0, один раз 1, один раз 2 и один раз 3. (цифры от фонаря взял). Вот это случайность - ее невозможно предугадать. А нам нужно, чтоб 0, 1, 2, 3 выпадали с некоей равномерностью. Поэтому нельзя обвинять рэндом в неслучайности, когда нам нужна не случайность, а закономерность. Я когда-то долго искал ОБЪЕКТИВНЫЕ доказательства неслучайности рэндома. И до сих пор не нашел, поэтому и задал вопрос. Согласен - для создания приложений такая абсолютная случайность иногда не подходит, поэтому нужно писать разные алгоритмы, чтобы числа выбрасывались с некоторой равномерностью.

TanaTiX 29.01.2012 12:57

Цитата:

Поэтому нельзя обвинять рэндом в неслучайности, когда нам нужна не случайность, а закономерность.
Спорить не буду, к тому же мне "случайности" рэндома всегда хватало, а такую информацию получил когда-то, бороздя просторы интернета. Есть разные точки зрения на этот счет (в т.ч. аргументированные); как уже говорил, написал эту информацию исключительно ради справедливости, а не для очередного холивара и массовых проверок.

HardCoder 29.01.2012 13:01

Цитата:

Сообщение от TanaTiX (Сообщение 1059747)
как уже говорил, написал эту информацию исключительно ради справедливости, а не для очередного холивара и массовых проверок.

Согласен. Да умрет холивар в этой теме!

Wolsh 29.01.2012 17:10

Цитата:

Wolsh, нет не исключаются. Для них условие по идее никогда не выполнится.
Ага. Поэтому trace(randomInt(0, 5, 6)); никогда не выдаст 5. Ситуация с параметрами может и лукавая, но вполне вероятная на практике.
Еще у этого алгоритма одно из чисел диапазона никогда не выдается в первой десятке результатов, что прискорбно((

Добавлено через 27 минут
Сама идея замены совпадения с исключением на сознательно негенерируемый max весьма элегантна.
Претензия только к тому, что поведение при таких параметрах "удивляет", то есть не соответствует ожидаемому.

silin 29.01.2012 18:02

такой еще вариант до кучи )
Код AS3:

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));
        }
}


wvxvw 29.01.2012 19:53

Тут очень много зависит от того, что именно вы называете случайным числом. Фишка в том, что ни один из приведенных выше примеров скорее всего не пройдет diehard test, не смотря на то, что число, вобщем-то будет "случайным".
Вариант о котором я думал: выбирать случайно из двух диапазонов: min<exclude и exclude>max - но это расточительно, если нужно часто радном генерировать.
А можно полюбопытствовать, зачем это понадобилось, и на скольк важна правильная (взвешенная) рандомность?

silin: О, я твой вариант не видел, когда писал, я вот тоже о чем-то таком думал, только не нужно два раза random() вызывать. Если закешировать первый вызов и им и воспользоваться, то и дешевле выйдет и больше вероятность, что в итоге распределение будет правильным.


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

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