[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: [РЕШЕНО] Алгоритм шанса выпадания по проценту
Zerstoren
Сначала кратко.
Есть игровой магазин.
Вещи в нем появляются с числовым шансом.

Сейчас генерируется с шансом от 50% до 1%

$random = rand(1,100);
if(is_int($random / $ws->chance)) // $ws->chance - содержит целое число, ну думаю тут все ясно.
//... Если число целое, то знач моно добавить


Но меня он не устраивает.

Нужно чтоб был шанс и 75% и 0,001%

Сначала были мысли сделать так:

$percet = '10';
$chance = 100 / $percet;
echo rand(1,$chance);


Ну вроде ок. Получил шанс 10%.

Но вот беда, если написать
$percet = '65';
$chance = 100 / $percet;
echo rand(1,$chance);

То шанс уже не 65%, а 100%

Перерыл гугл, но вся выдача ссылается на форумы линейки где всякие шизики хотят обойти алгортим заточки и дропа =)

Может у кого-то есть идеи или готовые решения?



Спустя 8 минут, 25 секунд (28.03.2011 - 20:02) Snus написал(а):
Кагбэ таг:

$x = 30; // типа процент шанса
$y = rand(1,(100-$x));
echo ($y == 1) ? 'УДАЧА' : 'НЕУДАЧА';

Спустя 4 минуты (28.03.2011 - 20:06) Zerstoren написал(а):
Каг бе некатит =(

$x = 30; // типа процент шанса
$y = rand(1,(100-$x)); // Первый параметр 1, тут все ясно, но вот во втором параметре число 70. а значит шанс 1 из 70.
echo ($y == 1) ? 'УДАЧА' : 'НЕУДАЧА';

Да и вновь не запахают флоат проценты.

Спустя 22 минуты, 30 секунд (28.03.2011 - 20:28) Snus написал(а):
$x = 30; // типа процент шанса
$y = round((100 / $x));
$z = rand(1,$y);
echo ($y == 1) ? 'УДАЧА' : 'НЕУДАЧА';

А почему такой вариант не подходит?

Спустя 5 минут, 43 секунды (28.03.2011 - 20:34) Zerstoren написал(а):
Нужно чтоб был шанс и 75% и 0,001%

в данном варианте нету шанса в 51% и выше.

Спустя 3 минуты, 38 секунд (28.03.2011 - 20:38) Snus написал(а):
Процент - это дело условное. Просчитать его правильность невозможно. Придумай свою систему процентов.

$x = 30; // типа процент шанса
$y = ceil((100 * (100 / $x)));
$z = rand(100,$y);
echo ($y == 100) ? 'УДАЧА' : 'НЕУДАЧА';


Спустя 14 минут, 44 секунды (28.03.2011 - 20:52) Zerstoren написал(а):
Вот Snus, смотрите.
Если мы берем уже дробное число, то с ним все ок.

вот так все отлично
$percent = '40';
$num = 100 / $percent;
echo mt_rand(1,$num) == 1? 'true' : 'false';


Но вот с целыми числами все плохо. Потому что я не могу рассчитать правильно шанс.

Спустя 13 минут, 15 секунд (28.03.2011 - 21:06) inpost написал(а):
Делаем rand(1,$limit);


Если 1% - $limit = 100;
Если 0,1% - $limit = 1000;
Если 0,01% - лимит = 10 000;
То есть установить надо количество цифр после запятой, и умножить 100*$n;
число, начиная от начала, если 0,01% - то число 001 = 1, если число 5,17, то число 517 ($number).
if (rand(1,(100*$n)) <= $number)

Спустя 26 минут, 7 секунд (28.03.2011 - 21:32) Zerstoren написал(а):
Инпост пасиб. Идея правильная, но не реализация.

Вот так нужно было

$n = 90;
$x = rand(1,100);
var_dump($x <= $n);

А по сути, полная функция выглядит вот так

function randomize($n) {
if(strstr($n,'.')){
$chance = 100 / $n;
return rand(1,$chance) < 1;
}else{
$x = rand(1,100);
return $x < $n;
}
}


Можно вбивать как и целые так и дробные числа)

в условии я не использовал is_float т.к. может постипить стринг с базы.

Сабж решен, всем спасибо)

Спустя 41 минута, 32 секунды (28.03.2011 - 22:13) inpost написал(а):
Zerstoren
Главное результат =)

Спустя 3 минуты, 46 секунд (28.03.2011 - 22:17) Zerstoren написал(а):
Цитата (inpost @ 28.03.2011 - 19:13)
Zerstoren
Главное результат =)

Главное натолкнуть на идею)

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

Спустя 8 минут, 35 секунд (28.03.2011 - 22:26) inpost написал(а):
Zerstoren
Всё получилось? А что именно ты делал, если не секрет? smile.gif

Спустя 3 минуты, 44 секунды (28.03.2011 - 22:29) Zerstoren написал(а):
Реализацию рандомного появления вещей в магазине игрового движка forum-game
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.