За последние 24 часа нас посетили 18380 программистов и 1647 роботов. Сейчас ищут 1804 программиста ...

Интересная задачка

Тема в разделе "Прочие вопросы по PHP", создана пользователем UFO_, 29 май 2012.

  1. UFO_

    UFO_ Активный пользователь

    С нами с:
    29 фев 2012
    Сообщения:
    17
    Симпатии:
    0
    Есть массив {78,45}
    Необходимо напечатать эти числа в соотношении 70/30. За один запрос можно вывести только одно число.
    Например, если будет сделано 100 запросов на скрипт, будет выведено 70 раз - 78, 30 раз - 45.
    Вопрос, как такое сделать? Подскажите алгоритм.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    аааа

    тебе рандом или гарантированно?
     
  3. UFO_

    UFO_ Активный пользователь

    С нами с:
    29 фев 2012
    Сообщения:
    17
    Симпатии:
    0
    Спасибо за наводку)
    Код (Text):
    1. $one=0;
    2. $two=0;
    3. for($i=0; $i < 100; $i++){
    4.         if(rand(0,100) > 70)
    5.                 $one++;
    6.         else
    7.                 $two++;
    8. }
    9. echo  $one."\n".$two."\n";
    А какой есть вариант сделать гарантированно? (Запросы могут быть в несколько потоков)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    забить массив. 70 первых, 30 вторых, потом массив рандомайз и выводить по очереди, отрезая член массиву. =)

    Добавлено спустя 1 минуту 36 секунд:
    имей в виду, это всё делается стандартными функциями =)
     
  5. artem-Kuzmin

    artem-Kuzmin Активный пользователь

    С нами с:
    16 фев 2012
    Сообщения:
    809
    Симпатии:
    0
    Желательно заместо ранд mt_rand
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Код (PHP):
    1. <?php
    2. $data = array(78, 48);
    3. $probability = array(70, 30);
    4. $point = mt_rand(0, array_sum($probability));
    5. $sum = 0;
    6. foreach($probability as $key => $value) {
    7.     $sum += $value;
    8.     if($point <= $sum)
    9.         break;
    10. }
    11. echo($data[$key]);
    12. ?>
     
  7. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    Код (PHP):
    1. <?php
    2. $data = array(78, 48);
    3. $probability = array(70, 30);
    4. $rez = array();
    5. for ($i=0; $i<count($data); $i++){
    6.     for ($j=0; $j<$probability[$i]; $j++) $rez[] = $data[$i];
    7. }
    8. shuffle($rez);
    9. print_r($rez);
    10. ?>
    Добавлено спустя 8 минут 37 секунд:
    о, вот так прикольнее, лишний цикл убираем
    Код (PHP):
    1. <?php
    2. $data = array(78, 48);
    3. $probability = array(70, 30);
    4. $rez = array();
    5. for ($i=0; $i<count($data); $i++){
    6.     array_pad($rez, count($rez) + $probability[$i], $data[$i])
    7. }
    8. shuffle($rez);
    9. print_r($rez);
    10. ?>
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Код (PHP):
    1. $data = array(
    2.     78 => 70,
    3.     48 => 30);
    4. $result = array();
    5. foreach ($data as $number => $probability) {
    6.   $result = array_pad($result, count($result) + $probability, $number);
    7. }
    8. shuffle($result); 
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Мой вариант работает примерно в 25-30 раз быстрее и не кушает память на создание ненужного массива ради выбора единственного варианта :)

    Добавлено спустя 8 минут 10 секунд:
    * в 25-30 раз на конкретно этих исходных данных. Если суммарное значение вероятностей уменьшается - то уменьшается и разница во времени выполнения. Если увеличивается - то, соответственно, увеличивается.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в представленном коде я вобще не понимаю, что делает твой код например. =) И результата он не выдает.
     
  11. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    а он точно решает поставленную в начале темы задачу??
    вроде бы всё-таки несколько другую
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Выбирает случайное значение из заданного списка с учётом вероятности выпадения того или иного. Результат выдаёт у меня - собственно, распечатывает выбранный элемент.

    Добавлено спустя 1 минуту 4 секунды:
    А, понял, кажется. Вот этого не заметил
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    омг, а как ты умудрился выборку случайного элемента аж с циклом замутить?

    Добавлено спустя 15 секунд:
    цикл в случайной выборке одного элемента?
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну да, там же вероятность нужно учитывать.
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а цикл-то зачем, братиш?
     
  16. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Х.з.
    А как иначе? Может туплю, конечно...
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    разбирали в темке про казино. искать лениво. там вроде обмусолили всё как только можно. Может ты и прав. Я чета сам туплю, у меня утро еще. Дварф фортресс осваивал.