Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Dreembround
1 / 1 / 0
Регистрация: 01.11.2014
Сообщений: 35
1

Рандомные числа с вероятностью выпадения

16.06.2018, 20:26. Просмотров 521. Ответов 9
Метки нет (Все метки)

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

Сам рандом
PHP
1
2
3
4
5
6
7
$nums = '8,15,24,11';
 
$nums_arr = explode(',', $nums);
 
$rand_num = $nums_arr[array_rand($nums_arr)];
 
echo $rand_num;
Допустим
у числа 8 (процент выпадения 0.1%)
у числа 15 (процент выпадения 0.5%)
у числа 24 (процент выпадения 2.5%)
у числа 11 (процент выпадения 5.5%)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2018, 20:26
Ответы с готовыми решениями:

Вывод рандомного числа ихходя из вероятности вероятностью
Здравствуйте. Мозг уже вообще не варит... :) Вот весь код. <?php...

Шанс выпадения
Передо мной стоит задача сделать шанс выпадения предметов. Суть такая, есть...

Шанс выпадения числа
Доброе время суток,подскажите как правильно сделать шанс выпадения числа. У...

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

Рандомные цифры
Ребят, а можно сделать так, чтобы каждую минуту генерировались цифры и...

9
Jewbacabra
Эксперт PHP
3433 / 2857 / 1285
Регистрация: 24.04.2014
Сообщений: 8,669
16.06.2018, 21:13 2
Цитата Сообщение от Dreembround Посмотреть сообщение
у числа 8 (процент выпадения 0.1%)
у числа 15 (процент выпадения 0.5%)
у числа 24 (процент выпадения 2.5%)
у числа 11 (процент выпадения 5.5%)
Сумма вероятностей должна быть 100%
0
Dreembround
1 / 1 / 0
Регистрация: 01.11.2014
Сообщений: 35
16.06.2018, 21:31  [ТС] 3
я примерно написал
0
Jewbacabra
Эксперт PHP
3433 / 2857 / 1285
Регистрация: 24.04.2014
Сообщений: 8,669
16.06.2018, 22:04 4
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function randomFactory(array $data): Closure {
    $values = [];
    $rand = 0;
    foreach ($data as $value => $chance) {
        $values[] = [
            'rand' => $rand += $chance,
            'value' => $value,
        ];
    }
 
    return function () use ($values) {
        $rand = random_int(0, PHP_INT_MAX) / PHP_INT_MAX;
        foreach ($values as $value) {
            if ($rand < $value['rand']) {
                return $value['value'];
            }
        }
 
        throw new LogicException('smth get wrong');
    };
}
 
$data = [
    1 => 0.1,
    2 => 0.25,
    3 => 0.25,
    4 => 0.4,
];
$random = randomFactory($data);
 
$result = array_combine(array_keys($data), array_fill(0, count($data), 0));
$attempts = 10000;
for ($i = 0; $i < $attempts; ++$i) {
    $rand = $random();
    ++$result[$rand];
}
 
echo "value\tcount\texpected\treal\tdiff", PHP_EOL, PHP_EOL;
foreach ($result as $value => $count) {
    $real = $count / $attempts;
    $diff = abs($real - $data[$value]);
    printf("%d\t%5d\t%8.2f\t%.2f\t%.2f" . PHP_EOL, $value, $count, $data[$value], $real, $diff);
}
https://ideone.com/687fQ6
0
полудух
149 / 164 / 43
Регистрация: 15.03.2016
Сообщений: 1,003
17.06.2018, 04:28 5
там скорее требуется, чтобы ф-я возвращала число
а иногда нужное число...
читор кароч.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// массив должен быть отсортирован по %, по возрастанию, и они должны быть УНИКАЛЬНЫМИ
$arr = array(8=>1, 15=>5, 24=>25, 11=>55); // массив подразумевает, что 0.1% от 1000 это 1, а 5.5% = 55 (ну раз уж с десятичными хотите работать)
$max = 0; // максимально возможный % из $arr (вычисляется автоматом)
$dia = array(1, 100); // диапазон допустимых чисел
 
foreach ($arr as $num=>$p) {
    if ($p > $max) {$max = $p;}
    $cnt[$num] = 0; // инициализация массива для подсчётов
}
foreach (range(1, 10000) as $a) {$num = give_better_num();}
 
var_dump($cnt, $num); // результаты
// А в результатах мы наблюдаем, что перед 5.5% стоят другие шансы и они забирают свою долю.
// Т.е. 2.5% шанс означает, что у 5.5% останется только 3%. Это и получаем: 11 = ~300 из 10000
 
 
function give_better_num()
{
    global $cnt, $dia, $arr, $max;
 
    // этот диапазон ДОЛЖЕН УЧИТЫВАТЬ значения в $arr, если там 25 и 55, значит 1000, а если 2 и 5, то 100
    $tmp = mt_rand(1, 1000); // случайное число, по которому вычисляем, а не пора ли выдать "заказной номер"
 
    // если шанс не выпал, верну обычный рандом (который, кстати, может случайно выдать число из "заказных", но мне просто влом это обрабатывать, шанс мелкий)
    if ($tmp > $max) {return mt_rand($dia[0], $dia[1]);}
 
    foreach ($arr as $num=>$p) {
        if ($tmp <= $p) {
            $cnt[$num]++; // это можно убрать
            return $num." - magic num";
        }
    }
 
} // give_better_num
1
Dreembround
1 / 1 / 0
Регистрация: 01.11.2014
Сообщений: 35
20.06.2018, 12:42  [ТС] 6
Всем привет.
стоит такой вопрос как сделать рандом по ячейкам с вероятностью выпадения.

есть рандом:
PHP
1
2
3
4
$nums = '8,15,24,11'; //<= 45 чисел через запитую  разной последовательностью 
$nums_arr = explode(',', $nums);
$rand_num = $nums_arr[array_rand($nums_arr)];
echo $rand_num;

1 ячейка = 60% числа от 1, до 20 ($nums)<= тут 20 чисел через запятую.
2 ячейка = 20% числа от 20, до 30 ($nums) <= тут 10 чисел через запятую.
3 ячейка = 10% числа от 30, до 35 ($nums) <= тут 5 чисел через запятую.
4 ячейка = 7% числа от 35, до 42 ($nums) <= тут 7 чисел через запятую.
5 ячейка = 3% числа от 42, до 45 ($nums) <= тут 3 числа через запятую.

как сделать что бы из 1 ячейки вероятность выпадения числа было больше чем у 2 ячейки по 5 ?
0
edward_freedom
1555 / 1434 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
23.06.2018, 21:17 7
Dreembround, коды выше не работают или есть другая причина?
0
Para bellum
Эксперт PHP
4103 / 3051 / 985
Регистрация: 06.01.2011
Сообщений: 8,931
25.06.2018, 09:19 8
Rand() в процентном соотношении
0
Esexinex
1 / 1 / 0
Регистрация: 27.06.2018
Сообщений: 6
30.06.2018, 16:06 9
Цитата Сообщение от Dreembround Посмотреть сообщение
Всё здравствуйте.
Помогите знающие люди пожалуйста, как реализовать php формулу рандома с вероятность выпадений определённый чисел.

Сам рандом
PHP
1
2
3
4
5
6
7
$nums = '8,15,24,11';
 
$nums_arr = explode(',', $nums);
 
$rand_num = $nums_arr[array_rand($nums_arr)];
 
echo $rand_num;
Допустим
у числа 8 (процент выпадения 0.1%)
у числа 15 (процент выпадения 0.5%)
у числа 24 (процент выпадения 2.5%)
у числа 11 (процент выпадения 5.5%)
Сначала показалось что гипер заумная задача
Главный ньюанс,что процент выпадения высчитывается по математической пропорции,которую я знаю со времен школы,и часто использую

24 = 100%
4 = ? %

Надо (4 * 100) /24

Я сделал перебор 1000 попыток и рандом из 100 чисел,можешь исправить как надо

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?
 
$x8='0';
$x15='0';
$x24='0';
$x11='0';
 
for($g=0;$g<1000;$g++) {
 
$sis=rand(1,100);
    if($sis=='8') {  $x8=$x8+1;  }
    if($sis=='15') {  $x15=$x15+1;  }
    if($sis=='24') {  $x24=$x24+1;  }
    if($sis=='11') {  $x11=$x11+1;  }
}
 
echo '<br>Число 8 выпало '.$x8.' раз';
echo '<br>Число 15 выпало '.$x15.' раз';
echo '<br>Число 24 выпало '.$x24.' раз';
echo '<br>Число 11 выпало '.$x11.' раз';
 
$x_total=$x8+$x15+$x24+$x11;
 
echo '<br><br>Все числа выпали '.$x_total.' раз';
 
$x8_procent=($x8*100)/$x_total;
$x15_procent=($x15*100)/$x_total;
$x24_procent=($x24*100)/$x_total;
$x11_procent=($x11*100)/$x_total;
 
echo '<br><br>Число 8 выпало '.$x8_procent.'% случаев ';
echo '<br>Число 15 выпало '.$x15_procent.'% случаев ';
echo '<br>Число 24 выпало '.$x24_procent.'% случаев ';
echo '<br>Число 11 выпало '.$x11_procent.'% случаев ';
 
?>
Добавлено через 18 минут
Если надо проверять 4 рандомные числа,а не 8,24,11,15 - то легко исправить ,допишу
1
Dreembround
1 / 1 / 0
Регистрация: 01.11.2014
Сообщений: 35
12.07.2018, 00:57  [ТС] 10
Цитата Сообщение от Esexinex Посмотреть сообщение
Сначала показалось что гипер заумная задача
Главный ньюанс,что процент выпадения высчитывается по математической пропорции,которую я знаю со времен школы,и часто использую
24 = 100%
4 = ? %
Надо (4 * 100) /24
Я сделал перебор 1000 попыток и рандом из 100 чисел,можешь исправить как надо
PHPВыделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?
$x8='0';
$x15='0';
$x24='0';
$x11='0';
for($g=0;$g<1000;$g++) {
$sis=rand(1,100);
* * if($sis=='8') { *$x8=$x8+1; *}
* * if($sis=='15') { *$x15=$x15+1; *}
* * if($sis=='24') { *$x24=$x24+1; *}
* * if($sis=='11') { *$x11=$x11+1; *}
}
echo '<br>Число 8 выпало '.$x8.' раз';
echo '<br>Число 15 выпало '.$x15.' раз';
echo '<br>Число 24 выпало '.$x24.' раз';
echo '<br>Число 11 выпало '.$x11.' раз';
$x_total=$x8+$x15+$x24+$x11;
echo '<br><br>Все числа выпали '.$x_total.' раз';
$x8_procent=($x8*100)/$x_total;
$x15_procent=($x15*100)/$x_total;
$x24_procent=($x24*100)/$x_total;
$x11_procent=($x11*100)/$x_total;
echo '<br><br>Число 8 выпало '.$x8_procent.'% случаев ';
echo '<br>Число 15 выпало '.$x15_procent.'% случаев ';
echo '<br>Число 24 выпало '.$x24_procent.'% случаев ';
echo '<br>Число 11 выпало '.$x11_procent.'% случаев ';
?>
Добавлено через 18 минут
Если надо проверять 4 рандомные числа,а не 8,24,11,15 - то легко исправить ,допишу
смотри: у меня в базе лежат цифры например (8,24,11,15) мне надо каждому числу присвоить процент выпадения
что бы число 8 падала чаще чем 15 например
я пробовал добавить в базу числа (8,8,8,8,24,24,24,24,11,11,15) таким образом но число 15 очень часто дропается
0
12.07.2018, 00:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2018, 00:57

Рандомные тексты да нет
Доброй ночи. Ув. Профессоры может у кого есть или помогите сделать маленький...

Рандомные буквы (слова)
Привет форумчанам! Прохожу курс PHP на codeacademy и столкнулась с задачей: 1)...

Рандомные баннеры на одной страничке.
Как сделать так, чтобы разные баннеры (гифы или свф) на одной страничке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru