Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Шанс выпадения числа


Автор: QaaZ 20.11.2008, 17:47
Вот к примеру у меня есть сценарий, который случайным(rand(0,9)) образом выбирает 3 числа. Например [3 5 3].

Как можно сделать так, чтобы шанс на то, что выпадет [7 7 7] был к примеру 80% или 99%. 

Вообще, как реализуется "шанс" ?  smile 

Заранее большое спасибо и извините, если это обсуждалось уже, поиск результатов не дал.

Автор: theworldcreator 20.11.2008, 17:54
Когда я столкнулся с такой задачей, не стал вникать и просто заполнял массив($arr[mt_rand(0, count($arr)-1)]) бОльшим количеством одинаковых чисел с высоким шансом выпадения, чем с меньшим. Может есть и более рациональный способ.

Автор: QaaZ 20.11.2008, 18:04
Хм...как вариант! Правда хотелось бы услышать, может есть еще какие-нибудь способы.


 Спасибо большое, поставил бы плюсик, да только пока немогу.


Автор: skyboy 20.11.2008, 18:14
Цитата(QaaZ @  20.11.2008,  16:47 Найти цитируемый пост)
Как можно сделать так, чтобы шанс на то, что выпадет [7 7 7] был к примеру 80% или 99%. 

в твоем случае - все достаточно просто.
проверяем: если rand()> 0.01(вероятность - 99%), то возвращаем 7 7 7, в противном случае - генерируем тройку случайных чисел(проверяем при этом, чтоб там было не 7 7 7).
в более сложных случаях алгоритм может быть(будет) другим.

Автор: QaaZ 20.11.2008, 18:50
Извините, я несовсем понял, если можно, будьте добны  smile 


Вы имеете ввиду, чтото вроде этого:

Код

if (rand() > 0,01)
    {
         echo "777";
    }




Если да, тогда возникает вопрос,  как rand() может быть больше 0,01 % ? о_О Что-то я несовсем понимаю..

Автор: skyboy 20.11.2008, 19:51
Цитата(QaaZ @  20.11.2008,  17:50 Найти цитируемый пост)
как rand() может быть больше 0,01

rand()  возвращает случайное число от 0,001 до 0,999 с предположительно равной вероятностью.

Автор: QaaZ 20.11.2008, 20:18
Большое спасибо.. smile

Автор: Shogun 22.11.2008, 14:35
мммм, я тоже както думал о такой теме. 

А если так?? :
Код

<?php

  $numbers = array();
  
  # 1=5%, 2=5%, 3=5%, 4=5%, 5=10%, 6=20%, 7=50%
  $chance = array(1=>5, 2=>5, 3=>5, 4=>5, 5=>10, 6=>20, 7=>50);
  
  foreach($chance as $n=>$p)
    {
      for($i=1;$i<=$p;$i++) { $numbers[] = $n; }    
    }

  for($i=1;$i<=3;$i++)
    {
      echo $numbers[rand(0,count($numbers)-1)].' ';    
    }

?>

Автор: theworldcreator 22.11.2008, 14:48
ИМХО идея skyBoy лучше моей) 
Код

<?php
  # 1=5%, 2=5%, 3=5%, 4=5%, 5=10%, 6=20%, 7=50%
  $chance = array(1=>5, 2=>5, 3=>5, 4=>5, 5=>10, 6=>20, 7=>50);
  
  $rand = rand();
  $from = 0;
  foreach($chance as $n=>$p)
    {
      if($rand > $from AND $rand <= ($from+$p/100)) break;
       $from += $p/100;
    }
  echo $n;
?>

Автор: Shogun 22.11.2008, 14:59
theworldcreator - может быть. smile


Автор: skyboy 22.11.2008, 16:55
я думаю, можно сделать так:
Код

function urand($callback)
{
  $result= rand();
  while($callback($result)< rand())
  {
    $result= rand();
  }
  return $result;
}

функция $callback принимает один аргумент(сгенерированное случайное число от 0 до 1) и возвращает значение распределения вероятности для этого числа. для равномерного распределения вероятности возвращает 1. для равномерно возрастающего(чем более число, тем вероятнее его использование) просто возвращает входящее число и тыды.
естественно, функция urand() возвращает только число от 0 до 1, потому надо бы доработать для произвольных интервалов. или даже дискретных последовательностей.

Добавлено через 4 минуты и 22 секунды
если $callback вернет 0 - то случайное значение не будет использовано.
если $callback вернет 1 - случайное значение будет использовано.
в остальных случая вероятность использования случайно выбранного от 0 до 1 числа составляет $callback/1ю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)