Есть массив {78,45} Необходимо напечатать эти числа в соотношении 70/30. За один запрос можно вывести только одно число. Например, если будет сделано 100 запросов на скрипт, будет выведено 70 раз - 78, 30 раз - 45. Вопрос, как такое сделать? Подскажите алгоритм.
Спасибо за наводку) Код (Text): $one=0; $two=0; for($i=0; $i < 100; $i++){ if(rand(0,100) > 70) $one++; else $two++; } echo $one."\n".$two."\n"; А какой есть вариант сделать гарантированно? (Запросы могут быть в несколько потоков)
забить массив. 70 первых, 30 вторых, потом массив рандомайз и выводить по очереди, отрезая член массиву. =) Добавлено спустя 1 минуту 36 секунд: имей в виду, это всё делается стандартными функциями =)
Код (PHP): <?php $data = array(78, 48); $probability = array(70, 30); $point = mt_rand(0, array_sum($probability)); $sum = 0; foreach($probability as $key => $value) { $sum += $value; if($point <= $sum) break; } echo($data[$key]); ?>
Код (PHP): <?php $data = array(78, 48); $probability = array(70, 30); $rez = array(); for ($i=0; $i<count($data); $i++){ for ($j=0; $j<$probability[$i]; $j++) $rez[] = $data[$i]; } shuffle($rez); print_r($rez); ?> Добавлено спустя 8 минут 37 секунд: о, вот так прикольнее, лишний цикл убираем Код (PHP): <?php $data = array(78, 48); $probability = array(70, 30); $rez = array(); for ($i=0; $i<count($data); $i++){ array_pad($rez, count($rez) + $probability[$i], $data[$i]) } shuffle($rez); print_r($rez); ?>
Код (PHP): $data = array( 78 => 70, 48 => 30); $result = array(); foreach ($data as $number => $probability) { $result = array_pad($result, count($result) + $probability, $number); } shuffle($result);
Мой вариант работает примерно в 25-30 раз быстрее и не кушает память на создание ненужного массива ради выбора единственного варианта Добавлено спустя 8 минут 10 секунд: * в 25-30 раз на конкретно этих исходных данных. Если суммарное значение вероятностей уменьшается - то уменьшается и разница во времени выполнения. Если увеличивается - то, соответственно, увеличивается.
в представленном коде я вобще не понимаю, что делает твой код например. =) И результата он не выдает.
Выбирает случайное значение из заданного списка с учётом вероятности выпадения того или иного. Результат выдаёт у меня - собственно, распечатывает выбранный элемент. Добавлено спустя 1 минуту 4 секунды: А, понял, кажется. Вот этого не заметил
омг, а как ты умудрился выборку случайного элемента аж с циклом замутить? Добавлено спустя 15 секунд: цикл в случайной выборке одного элемента?
разбирали в темке про казино. искать лениво. там вроде обмусолили всё как только можно. Может ты и прав. Я чета сам туплю, у меня утро еще. Дварф фортресс осваивал.