Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
 Аватар для Братуха
5 / 5 / 5
Регистрация: 15.07.2012
Сообщений: 773

Rand() в процентном соотношении

23.06.2016, 12:02. Показов 5760. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. У меня есть две строчки, в будущем не исключено что будет больше. так вот я хотел спросить как можно сделать rand в процентном соотношении допустим на первую строчку 20% а на вторую 80%
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.06.2016, 12:02
Ответы с готовыми решениями:

Идентичность слов в процентном соотношении
Как можно проверить два слова на идентичность?? на совпадение их символов, процентов на 60..?

Как отобразить в процентном соотношении
как подсчитать количество оценок определённого балла в процентном соотношении как на рисунке ? на сколько я понял там через...

Инициализация массива 0 и 1 в процентном соотношении
Доброго времени суток! Прошу помощи, самому ничего в голову не приходит, нагуглить ничего не получилось. Суть вопроса: необходимо...

8
 Аватар для Пифагор
2172 / 1655 / 840
Регистрация: 10.01.2015
Сообщений: 5,207
23.06.2016, 12:14
Возможно не понял, но вероятно вот:
PHP
1
2
if (rand(1, 100) < 80) /* 80% случаев*/  echo 'строка 1';
else echo 'строка 2';
1
 Аватар для Братуха
5 / 5 / 5
Регистрация: 15.07.2012
Сообщений: 773
23.06.2016, 12:48  [ТС]
Цитата Сообщение от Пифагор Посмотреть сообщение
if (rand(1, 100) < 80) /* 80% случаев*/ *echo 'строка 1';
else echo 'строка 2';
да этот способ для 2 значений а если их будет больше вот написал что-то но не знаю может что по лучше есть
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   public  function randProcent($array){
            $rand = rand(1,100);
            $summ = 0;
            $summ2 = 0;
 
            foreach ($array as $key => $value){
                $summ2 = $summ - $summ2; // значение от
                $summ = $summ + $key;// значение до
                if($summ > 100){
                    return 'error';
                }
                if ($rand <= $summ and $rand >= $summ2  ){
                    return $value;
                }
 
            }
 
        }
PHP
1
randProcent([ 20 => 'test', 80 =>'test2'])
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
23.06.2016, 13:51
Братуха,
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
<?php
function f($a)
{
    $r = rand(0, 100);
    $c = 0;
    foreach ($a as $k => $v)
    {
        $c += $k;
        if ($c >= $r)
            return $v;
    }
    
}
 
$a = [ 5 => 'a', 25 => 'b', 70 =>'c'];
$b = [];
for ($i = 0; $i < 101; ++$i)
{
    $r = f($a);
    echo "$r<br>\r\n";
    if (isset($b[$r]))
        $b[$r]++;
    else
        $b[$r] = 0;
}
 
print_r($b);
Code
1
2
3
4
5
6
Array
(
    [a] => 5
    [c] => 69
    [b] => 24
)
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
23.06.2016, 15:58
Цитата Сообщение от Братуха Посмотреть сообщение
этот способ для 2 значений а если их будет больше
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
    # Массив с данными, зависимыми от процентов
    $data = [
        ['percent' => 20, 'message' => 'Выпало 20 %'],
        ['percent' => 80, 'message' => 'Выпало 80 %'],
    ];
    
    # Получаем случайную цифру
    $percent = mt_rand(1, 100);
    
    # Получаем нужное сообщение
    foreach($data as $value)
        # Если найдено значение
        if($value['percent'] >= $percent){
            $message = $value['message'];
            
            break;
        }
    
    # Выводим сообщение
    echo $message;
Только есть момент: проценты в массиве нужно указывать в порядке возрастания. Ну и, само собой, сумма всех процентов не должна превышать 100.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
23.06.2016, 18:55
Лучший ответ Сообщение было отмечено Para bellum как решение

Решение

Цитата Сообщение от Para bellum Посмотреть сообщение
Только есть момент:
А если выпадет 81 и более получим Notice. Можно конечно подставить изначально элемент с максимальным шансом в $message, но тогда потеряем нормальное распределение. Я не просто так складываю там все шансы в функции.
1
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
24.06.2016, 06:57
pav1uxa, совершенно верно. Вот что значит спать по шесть часов в сутки.
Вот, доделал:
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
<?php
    # Массив с данными, зависимыми от процентов
    $data = [
        ['percent' => 70, 'message' => 'Будет выведено с вероятностью в 70%'],
        ['percent' => 10, 'message' => 'Будет выведено с вероятностью в 10%'],
        ['percent' => 20, 'message' => 'Будет выведено с вероятностью в 20%']
    ];
    
    # Получаем случайную цифру
    $percent = mt_rand(1, 100);
    
    $current = 0;
    
    # Получаем нужное сообщение
    foreach($data as $value){
        # Прибавляем к текущему проценту неудачно прошедшие проверку
        $current += $value['percent'];
        
        # Если найдено значение
        if($current >= $percent){
            $message = $value['message'];
            
            break;
        }
    }
    
    # Выводим сообщение
    echo $message;
Проценты теперь не обязательно указывать упорядоченно, главное, чтобы они с сумме сотню не превышали. То есть алгоритм такой:
Смотрим, входит ли выпавшее число в текущий диапазон. Если входит -- успех.
Если не входит -- прибавляем текущее число к сумме не прошедших проверку и следующий диапазон уже будет начинаться с этой суммы.
И так до конца.

То есть, данный пример работает так:
Выпало число в диапазоне до 70 (то есть 70% от ста) -- выведется первое сообщение.
Выпало число в диапазоне 70-80 (то есть 10% от ста) -- выведется второе сообщение.
Выпало число в диапазоне 80-100 (то есть 20% от ста) -- выведется третье сообщение.
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
24.06.2016, 19:13
Цитата Сообщение от Para bellum Посмотреть сообщение
Вот, доделал:
Ага и получилось то же самое что и у меня

Не по теме:

Все-таки нужно спать

0
24.06.2016, 19:40

Не по теме:

pav1uxa, это жесть, конечно. :D Я даже и не заметил. Просто посмотрел на Ваш код -- думаю, зачем там два цикла, а разобраться что к чему лень было. Второй цикл -- просто для проверки, оказывается.

Кстати, не очень удобно читать код, где имена непонятные. Ну это к слову.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2016, 19:40
Помогаю со студенческими работами здесь

Как отразить результат выполнения плана по договору в процентном соотношении?
Ребята, доброго времени суток. Помогите, пожалуйста вспомнить: &quot;как отразить результат выполнения плана по договору в процентном...

Сделать так, чтобы атомы в этой программе перемешивались в определённом процентном соотношении?
Доброе утро! Как сделать так, чтобы атомы в этой программе перемешивались в определённом процентном соотношении? import re,...

Найти ожидаемое количество серий (по признаку повтора одного цвета) в процентном соотношении
В урне белый шар и чёрный шар. Происходит опыт, заключающийся в вытаскивание одного из шаров наугад с последующим возвращением в урну. ...

Система тестирования качества образования в ВУЗе, с последующим выводом результатов в процентном соотношении
Добрый день! Нужна помощь. Нужно сделать что-бы после прохождения тестов результаты ответов выводились в проге в процентном...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru