информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаАтака на InternetЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Тогда можно и сократить массивчик. 07.10.03 13:20  Число просмотров: 1326
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
> Все равно выбирается рандомом. Какая разница случайный
> индекс в случайном массиве или случайный индекс в
> неслучайном.
Взять массив из 100 элементов, прописать каждый элемент вероятностью его выпадения, сгенерить нормализованное число в диапазоне от 0 до 1, пробежаться по массиву, вычитая из сгенеренного числа значение элемента массива. Как только число станет меньше нуля или равно нулю - индекс и будет это случайное число с учетом неравномерного распределения вероятности.
<programming>
[Perl] Генерация случайных чисел 06.10.03 14:01  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка>
необходимо написать ГСЧ, который бы выдавал числа от 0 до 100 включительно, но случайность их была распределена по неравномерному закону. То есть с 70%-ной случайностью генериловалось число от 0 до 70 и соответственно с 30%-ной случайностью число от 71 до 100. Подскажите, как это реализовать на perl? (Это нужно для игрового автомата)
Наверно наоборот тебе надо от 0 до 70 - 30%, 71 до 100 - 70% 06.10.03 15:53  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 06.10.03 16:02  Количество правок: 2
<"чистая" ссылка>
тогда в моем алгоритме надо будет пару циферек поменять
[Perl] Блин, вы че! Парню нужно нормальное распределение! 06.10.03 15:47  
Автор: whiletrue <Роман> Статус: Elderman
<"чистая" ссылка>
> необходимо написать ГСЧ, который бы выдавал числа от 0 до
> 100 включительно, но случайность их была распределена по
> неравномерному закону. То есть с 70%-ной случайностью
> генериловалось число от 0 до 70 и соответственно с 30%-ной
> случайностью число от 71 до 100. Подскажите, как это
> реализовать на perl? (Это нужно для игрового автомата)

См. ссылу и поисковики по теме: "гауссовское распределение генерация случайной величины"

Там задаешь нужную дисперсию и мат.ожидание и получаешь то, что надо

http://www.eugene.dp.ua/Superadmin/perl/chapter2/2_3.htm
[Perl] ...с математикой у меня проблемы:-) 06.10.03 16:09  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Там задаешь нужную дисперсию и мат.ожидание и получаешь то,
> что надо
Это было-бы круче чем просто результат разбить на числовой диапазон (0..70) (71..100), но у меня 3 балла по математике:)
ой скока алгоритмов для этого написали. дайте-ка и я ченить напишу Ж) 06.10.03 15:41  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
при инициализации проги генерируешь здоровый массив и запускаешь цикл который заполняет его числами приvерно так
int xxx[1000];
int i=n=0;
for(n=0;n<710;n++)
{
xxx[n]=i;i++;
if(i==71)i=0;
}
i=71;
for(n=711;n<1000;n++)
{
xxx[n]=i;i++;
if(i==101)i=71;
}

а затем когда надо вызываешь
int x=xxx[1000];
Выгода такого изврата в скорости random здесь вызывается тока 1 раз а это функция довольно тяжелая - для игрового автомата на перле это думаю будет полезно
Как бы это по-проще. 06.10.03 22:11  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 06.10.03 22:16  Количество правок: 1
<"чистая" ссылка>
> при инициализации проги генерируешь здоровый массив и
> запускаешь цикл который заполняет его числами приvерно так

Объяснить по-проще. Массивчик, действительно, раз так в десять больше надо завести. И заполняем его последовательно примерно так: надо чтобы 1 с вероятностью 0.01 вападала - заносим десять единиц, 2 с вероятностью 0.001 - заносим одну двойку, тройка с вероятностью 0.5 - заносим 500 троек. Вероятность вытаскивания тройки и будет 0.5, потому что отношение количества благоприятных событий (вытаскивание 3, а их 500 штук) к общему количеству 100*10 будет 500/1000 = 0.5. Двойка одна, вероятность 1/1000 = 0.001. Так для любого числа свою вероятность можно задать, заполнив им соответствующее количество ячеек массива.
Массивчик потом перетусовать надо (как колоду карт) и вытащить произвольное.
Можно и не тасовать массив 07.10.03 12:41  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Массивчик потом перетусовать надо (как колоду карт) и
> вытащить произвольное.
Все равно выбирается рандомом. Какая разница случайный индекс в случайном массиве или случайный индекс в неслучайном.
Тогда можно и сократить массивчик. 07.10.03 13:20  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
> Все равно выбирается рандомом. Какая разница случайный
> индекс в случайном массиве или случайный индекс в
> неслучайном.
Взять массив из 100 элементов, прописать каждый элемент вероятностью его выпадения, сгенерить нормализованное число в диапазоне от 0 до 1, пробежаться по массиву, вычитая из сгенеренного числа значение элемента массива. Как только число станет меньше нуля или равно нулю - индекс и будет это случайное число с учетом неравномерного распределения вероятности.
Тогда можно и сократить массивчик. 07.10.03 14:42  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Взять массив из 100 элементов, прописать каждый элемент
> вероятностью его выпадения, сгенерить нормализованное число
> в диапазоне от 0 до 1, пробежаться по массиву, вычитая из
> сгенеренного числа значение элемента массива. Как только
> число станет меньше нуля или равно нулю - индекс и будет
> это случайное число с учетом неравномерного распределения
> вероятности.
Оно то можно. Но с массивом лучше, если нужна скорость. Индексирование в массиве - одна из самых быстрых операций.

А если скорость не нужно, то лучше с массивами и не заморачиваться. Практически для любого распределения, можно вывести формулу преобразования равномерно распределенной случайной величины в величину, распределенную по данному закону.

А в данном конкретном случае это вообще кусочно линейная функция. Вот только уж очень она близка к обычному равномерному распределению. Так что имхо, лучше вообще не заморачиваться, а пренебречь мизерной неравномерностью.
Можно и без массивчика, но только в том случае, если закон распределения можно описать функцией. 08.10.03 10:29  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
Обращение к элементу массива будет быстрее вычисления любой функции. Будь то random^2. 08.10.03 12:52  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Это если это массив значений 08.10.03 13:40  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
А не плотностей распределения, как в предложенном варианте сокращения массива. :-)

2 DPP: В данном случае можно :-) Это кусочно линейная функция
Скорее всего дискретная, я так понял, что речь идет о целых числах. 08.10.03 16:02  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
[Perl] Объединяй известные генераторы последовательно! 06.10.03 15:06  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Берёшь любой «равномерный», как ты выразился, генератор...
И вот, после генерации числа, смотришь, к какому диапазону он относится... И если к тому, в котором вероятность должна быть ниже, пропускаешь это число и генеришь его снова... Вероятность появдения числа в «твоём» диапазоне падает в два раза. Если ещё надо уменьшить вероятность, опять проверяешь диапазон... Как ты думаешь, после пропуска второго числа на сколько уменьшиться вероятность? Правильно, в четыре раза! А потом в восемь и т.п. Тебе насколько надо, а то ты фигню какую-то (ниже) написал ;-)

> необходимо написать ГСЧ, который бы выдавал числа от 0 до
> 100 включительно, но случайность их была распределена по
> неравномерному закону. То есть с 70%-ной случайностью
> генериловалось число от 0 до 70 и соответственно с 30%-ной
> случайностью число от 71 до 100. Подскажите, как это
> реализовать на perl? (Это нужно для игрового автомата)
[Perl] Если важна та единица, которая была заявлена 06.10.03 15:23  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > неравномерному закону. То есть с 70%-ной
> случайностью
> > генериловалось число от 0 до 70 и соответственно с
> 30%-ной
> > случайностью число от 71 до 100. Подскажите, как это
> > реализовать на perl? (Это нужно для игрового автомата)
то есть не [0;69] и [70;99] а именно [0;70] и [71;100], то самый простой вариант: сначала определить диапазон, а в нем равномерно сгенерить число. То есть генерируем по равномерному закону распределения первое число в диапазоне [0;1)

Если оно меньше 0.7 - генерим равномерно число из диапазона [0;70], иначе - из диапазона [71;100]
[Perl] Генерация случайных чисел 06.10.03 14:39  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Отредактировано 06.10.03 14:42  Количество правок: 1
<"чистая" ссылка>
> необходимо написать ГСЧ, который бы выдавал числа от 0 до
> 100 включительно, но случайность их была распределена по
> неравномерному закону. То есть с 70%-ной случайностью
> генериловалось число от 0 до 70 и соответственно с 30%-ной
> случайностью число от 71 до 100. Подскажите, как это
> реализовать на perl? (Это нужно для игрового автомата)

От 0 до 100 включительно 101 число. Если при равномерном распределении число из диапазона от 71 до 100 выпадает с вероятностью 0.30, то из диапазона от 0 до 70 с вероятностью 0.71. Это, я тут немножко бред написал 0.30+0.71 не равняется 1.00, однако не имеет смысла заморачиваться с дробными числами.
Вам, видимо, сама методика нужна. Перл тут не причем. Преобразования на любых языках будут выглядеть сходно.
Игровой автомат на ПЕРЛЕ - прикольно.
И еще: вероятность в процентах не измеряется.
[Perl] Ну а где же тут неравномерность? 06.10.03 14:26  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> необходимо написать ГСЧ, который бы выдавал числа от 0 до
> 100 включительно, но случайность их была распределена по
> неравномерному закону. То есть с 70%-ной случайностью
> генериловалось число от 0 до 70 и соответственно с 30%-ной
> случайностью число от 71 до 100. Подскажите, как это
> реализовать на perl? (Это нужно для игрового автомата)

При равномерном законе распределения с вероятностью 0.7 будут попадаться числа от 0 до 69, и с вероятностью 0.3 - 70-99

Бери обычный генератор и не мучайся
[Perl] Спасибо amirul 06.10.03 16:05  
Автор: Hux0r Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Я так и сделал, проверил, такая вероятность 70/30 меня вполне устраивает:-)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach