вот моя функция
Например число от 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 какой кусочек программы соответствует.
А если интервалов приличное количество, то код получается громоздким. У меня таких интервалов штук 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%, вполне нормальный. Или есть другие способы подсчёта процентов?
Почему нет, не понимаю твоей логики. 40% + 60% = 100%. Вероятность каждого значения - 1%, вполне нормальный. Или есть другие способы подсчёта процентов?
Спустя 1 час, 49 минут, 27 секунд (23.01.2011 - 14:46) twin написал(а):
Подсчитать процент можно только от конечного числа обращений. Допусим от 100 или тысячи. А тут как? Где гарантия, что на данный момент не выпало 10 решек подряд? Оно может и выровняется когда-нибудь, но шанс перекоса имеет место быть. Так что сама постановка вопроса не совсем корректна.
Нельзя сделать вероятность 60/40 от неопределенной величины.
Как псевдораспределение приблизительно годится, будет плавать в пределах 2-3%, но это видимо допустимо.
Что касается
Нельзя сделать вероятность 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
Дело не в рендоме, важно сделать какое-то действие с определенной вероятностью. А если таких действий много? одно с вер-ю 5%, второе с 7%? к примеру штук 8-10. То выходит очень громоздко, потому и советуюсь :huh:
<?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.
А все просто, $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%.
Т.е. если при генерации случайного числа выпадает число от 1 до 10(10% вероятности), то будет - Привет. Иначе - Здравствуйте(от 11 до 100 - 90%).
Мое мнение, что вероятность попадания случайного числа в интервал 1-10 равна 10%, а верояность попадания в 11-100 равна 90%. Т.о. думаю вполне достоверная верояность выдачи нам первого слова в 10% и второго в 90% :)
Я понимаю, что при 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, ну откуда такие данные?
Запускаем:
При 10000:
При 1000000:
Запускаем:
$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;Но каждая новый рефреш дает разные проценты причем значений где первое более 10% и второе ниже 90% гораздо больше чем первое равно или менее 10% и второе равно или более 90%. Отсюда и мои данные, что попадание в установленные вероятности примерно равно 20%.
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>';
Спустя 51 минута, 24 секунды (24.01.2011 - 15:11) Michael написал(а):
Ты не правильно понимаешь. Теория вероятности работает при большом кол-ве попыток, чтобы оценить вероятность надо сделать большущюю выборку.
Случайное событие
закон больших чисел
А то по твоей логике и игральную кость если бросить 100 раз - стороны будут неравноценны. А вот бросив 10000 раз - получаем вероятность.
Случайное событие
закон больших чисел
А то по твоей логике и игральную кость если бросить 100 раз - стороны будут неравноценны. А вот бросив 10000 раз - получаем вероятность.
Спустя 1 минута, 58 секунд (24.01.2011 - 15:13) linker написал(а):
Michael
Именно поэтому я делаю двойной цикл 100 раз по 100. Просто не отобразил у себя примере, а описал словами.
Именно поэтому я делаю двойной цикл 100 раз по 100. Просто не отобразил у себя примере, а описал словами.
Спустя 3 часа, 29 минут, 24 секунды (24.01.2011 - 18:42) Alex2356 написал(а):
Michael
linker
Большое спасибо за разъяснения
linker
Большое спасибо за разъяснения
