[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод рендомного числа с определенной вероятностью
Alex2356
Как сделать такую штуку? Я сделал, но мне кажется, что это не оптимально. Может можно как-то пограмотней?
вот моя функция

Например число от 1 до 5 с вероятностью 40% и число от 6 до 10 с вероятностью 60%.

<?php
function
chislo(){
$rnd = mt_rand(1,100);
if($rnd>0 && $rnd<=40)
$a = mt_rand(1,5);
if($rnd>40 && $rnd<=100)
$a = mt_rand(6,10);
return $a;
}
?>




Спустя 1 час, 45 минут, 8 секунд (22.01.2011 - 17:11) inpost написал(а):
Почему нет? Первая проверка %, вторая - по ситуации числом. Нормально сделал.

Спустя 22 минуты, 31 секунда (22.01.2011 - 17:34) Alex2356 написал(а):
inpost

А если интервалов приличное количество, то код получается громоздким. У меня таких интервалов штук 5-6 выходит. Не очень удобно просчитывать в ручную, какому интервалу переменной $rnd какой кусочек программы соответствует.




Спустя 18 часов, 18 минут, 44 секунды (23.01.2011 - 11:53) linker написал(а):
В случае рандома не получается никакой вероятности. Все рушится когда выбирается первое число от 0 до 40 или от 40 до 100 - тут нет никакой вероятности, а значит нет никакой вероятности, что полученное значение будет действительно получено с вероятностью 40 или 60 процентов.

Спустя 1 час, 3 минуты, 22 секунды (23.01.2011 - 12:56) inpost написал(а):
linker
Почему нет, не понимаю твоей логики. 40% + 60% = 100%. Вероятность каждого значения - 1%, вполне нормальный. Или есть другие способы подсчёта процентов?

Спустя 1 час, 49 минут, 27 секунд (23.01.2011 - 14:46) twin написал(а):
Подсчитать процент можно только от конечного числа обращений. Допусим от 100 или тысячи. А тут как? Где гарантия, что на данный момент не выпало 10 решек подряд? Оно может и выровняется когда-нибудь, но шанс перекоса имеет место быть. Так что сама постановка вопроса не совсем корректна.
Нельзя сделать вероятность 60/40 от неопределенной величины.

Как псевдораспределение приблизительно годится, будет плавать в пределах 2-3%, но это видимо допустимо.

Что касается
Цитата
Не очень удобно просчитывать в ручную, какому интервалу переменной $rnd какой кусочек программы соответствует.
передай интервал аргументом:
    function chislo($sep)
{
$rnd = mt_rand(1, 100);

if($rnd > 0 && $rnd <= 40)
{
$a = mt_rand(1, $sep);
}

if($rnd > 40 && $rnd <= 100)
{
$a = mt_rand($sep + 1, 10);
}
return $a;
}

echo chislo(5);
echo chislo(10);

Спустя 2 часа, 14 минут, 13 секунд (23.01.2011 - 17:00) Alex2356 написал(а):
twin
<?php
function
chislo(){
$rnd = mt_rand(1,100);
if($rnd>0 && $rnd<=40)
//тут первое событие
if($rnd>40 && $rnd<=100)
//тут второе событие
return $a;
}
?>


Дело не в рендоме, важно сделать какое-то действие с определенной вероятностью. А если таких действий много? одно с вер-ю 5%, второе с 7%? к примеру штук 8-10. То выходит очень громоздко, потому и советуюсь :huh:

Спустя 16 часов, 56 минут, 45 секунд (24.01.2011 - 09:56) linker написал(а):
inpost
А все просто, $rnd = mt_rand(1,100); дает вероятность 1% из ста и нет тут никакой вероятности 40%, что оно будет от 0 до 40 и вероятности 60%, что оно будет от 41 до 100.

Спустя 24 минуты, 59 секунд (24.01.2011 - 10:21) Alex2356 написал(а):
linker
Я понимаю, что при mt_rand(1,100) изначально вероятность выпада каждого числа интервала одинакова.

Но я хотел улучшить, то что написано в начале темы.

К примеру задача такова - Вывести слово "Привет" с вероятностью в 10%, и слово "Здравствуйте" с вероятностью 90%.

<?php

$rnd = mt_rand(1,100);
if($rnd>0 && $rnd<=10)
echo 'Привет';
if($rnd>10 && $rnd<=100)
echo 'Здравствуйте';

}
?>

Т.е. если при генерации случайного числа выпадает число от 1 до 10(10% вероятности), то будет - Привет. Иначе - Здравствуйте(от 11 до 100 - 90%).

Мое мнение, что вероятность попадания случайного числа в интервал 1-10 равна 10%, а верояность попадания в 11-100 равна 90%. Т.о. думаю вполне достоверная верояность выдачи нам первого слова в 10% и второго в 90% :)

Спустя 37 минут, 43 секунды (24.01.2011 - 10:59) linker написал(а):
Написав небольшой текст, можно увидеть что вероятность правильного результата не переваливает даже за 20%. А отношение появления числа от 0 до 10 и от 11 до 100 равно 1 к 3 (усредненное значение).

Спустя 19 минут, 29 секунд (24.01.2011 - 11:19) Michael написал(а):
linker, ну откуда такие данные?
Запускаем:
$x = 0;
$y = 0;
for ($i = 1; $i <= 10000; $i++) {
$rnd = mt_rand(1,100);
if($rnd>0 && $rnd<=10) $x++;
if($rnd>10 && $rnd<=100)$y++;
}
echo 'Вероятность x:' . ($x/($x+$y)*100) . '%, ';
echo 'Вероятность y:' . ($y/($x+$y)*100) . '%';

При 10000:
Вероятность x:10.23%, Вероятность y:89.77%

При 1000000:
Вероятность x:9.9642%, Вероятность y:90.0358%



Спустя 3 часа, 1 минута, 3 секунды (24.01.2011 - 14:20) linker написал(а):
Запусти этот же код 100 раз и поймешь откуда у меня такие данные. У меян почти такой же код:
$a1 = $a2 = 0;
for($i = 0; $i < 100; $i ++)
{
$v = mt_rand(0, 100);
if ($v >=0 && $v <= 10)
$a1 ++;
else
if
($v > 10 && $v <= 100)
$a2 ++;
}

echo (($a1 * 100)/100) . '% from 100%<br>';
echo (($a2 * 100)/100) . '% from 100%<br>';
Но каждая новый рефреш дает разные проценты причем значений где первое более 10% и второе ниже 90% гораздо больше чем первое равно или менее 10% и второе равно или более 90%. Отсюда и мои данные, что попадание в установленные вероятности примерно равно 20%.

Спустя 51 минута, 24 секунды (24.01.2011 - 15:11) Michael написал(а):
Ты не правильно понимаешь. Теория вероятности работает при большом кол-ве попыток, чтобы оценить вероятность надо сделать большущюю выборку.
Случайное событие
закон больших чисел

А то по твоей логике и игральную кость если бросить 100 раз - стороны будут неравноценны. А вот бросив 10000 раз - получаем вероятность.

Спустя 1 минута, 58 секунд (24.01.2011 - 15:13) linker написал(а):
Michael
Именно поэтому я делаю двойной цикл 100 раз по 100. Просто не отобразил у себя примере, а описал словами.

Спустя 3 часа, 29 минут, 24 секунды (24.01.2011 - 18:42) Alex2356 написал(а):
Michael
linker
Большое спасибо за разъяснения smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.