Есть игровой магазин.
Вещи в нем появляются с числовым шансом.
Сейчас генерируется с шансом от 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% и выше.
в данном варианте нету шанса в 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)
Если 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);
А по сути, полная функция выглядит вот так
Можно вбивать как и целые так и дробные числа)
в условии я не использовал is_float т.к. может постипить стринг с базы.
Сабж решен, всем спасибо)
Вот так нужно было
$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
Всё получилось? А что именно ты делал, если не секрет?
Всё получилось? А что именно ты делал, если не секрет?

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