Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шанс выпадения числа, что-то вроде игровых автоматов 
V
    Опции темы
QaaZ
  Дата 20.11.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



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

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

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

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

Это сообщение отредактировал(а) QaaZ - 20.11.2008, 18:05
PM MAIL   Вверх
theworldcreator
Дата 20.11.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: 10
Всего: 13



Когда я столкнулся с такой задачей, не стал вникать и просто заполнял массив($arr[mt_rand(0, count($arr)-1)]) бОльшим количеством одинаковых чисел с высоким шансом выпадения, чем с меньшим. Может есть и более рациональный способ.
PM MAIL WWW ICQ   Вверх
QaaZ
Дата 20.11.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



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


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


PM MAIL   Вверх
skyboy
Дата 20.11.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



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

в твоем случае - все достаточно просто.
проверяем: если rand()> 0.01(вероятность - 99%), то возвращаем 7 7 7, в противном случае - генерируем тройку случайных чисел(проверяем при этом, чтоб там было не 7 7 7).
в более сложных случаях алгоритм может быть(будет) другим.
PM MAIL   Вверх
QaaZ
Дата 20.11.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Извините, я несовсем понял, если можно, будьте добны  smile 


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

Код

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




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


Это сообщение отредактировал(а) QaaZ - 20.11.2008, 19:00
PM MAIL   Вверх
skyboy
Дата 20.11.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



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

rand()  возвращает случайное число от 0,001 до 0,999 с предположительно равной вероятностью.
PM MAIL   Вверх
QaaZ
Дата 20.11.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Большое спасибо.. smile

Это сообщение отредактировал(а) QaaZ - 20.11.2008, 20:23
PM MAIL   Вверх
Shogun
Дата 22.11.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



мммм, я тоже както думал о такой теме. 

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

<?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)].' ';    
    }

?>



--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
theworldcreator
Дата 22.11.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: 10
Всего: 13



ИМХО идея 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;
?>

PM MAIL WWW ICQ   Вверх
Shogun
Дата 22.11.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 8.6.2006
Где: Кишинёв

Репутация: 9
Всего: 11



theworldcreator - может быть. smile




--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
skyboy
Дата 22.11.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



я думаю, можно сделать так:
Код

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ю
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0821 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.