|
|
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Расчет вероятности
Всем привет. Задался таким вопросом. Есть к примеру игровой предмет, вероятность его выпадения равна 3.85% из 100%. Подскажите метод реализации? Через Math.random получается только с целыми числами и то, выпадение от 1-4(если к примеру шанс выпадения равен 4%) это достаточно большой шанс мне кажется, а собственно нужно использовать наверно другой метод и с учетом сотых, а то и тысячных долей
|
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
|
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Ммм, что-то не пойму, это скобки дают результат возврата boolen-а, обычно просто Math.random без скобок возвращает число? И еще такой вопрос, 0.0385 это 3.85%? А если установить 0.55385, это какая вероятность? 55.385%?
|
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
Math.random() возвращает псевдослучайное число n, где 0 <= n < 1.
Причем n — число вещественное, а не целое (Number а не int). То есть функция может вернуть не только 0 или 1, но и числа между ними. Можно так написать var r:Number = Math.random() * 100; if (r < 3.85) { // предмет выпал; } else { // предмет не выпал; } Операция "<" возращает булеановское значение. http://help.adobe.com/ru_RU/FlashPla...html#less_than Извините если по-капитански написал )) |
|
|||||
Регистрация: Dec 2014
Сообщений: 312
|
caseyryan, спасибки, буду знать
|
|
|||||
Цитата:
Godwarlock, перед тем как задать вопрос "что возвращает Math.random()", попробуйте обратиться к документации от Adobe, где чётко и ясно на русском языке написано, что он возвращает. http://help.adobe.com/ru_RU/FlashPla....html#random() Вообще, Math.random без скобок возвращает функцию. Цитата:
шанс выпадения 1 из 4, 2 из 4, 3 из 4 и 4 из 4 одинаков, так как Math.random() возвращает псевдослучайное число от 0 до 1 без уклона в какую-либо сторону(равномерно). Проверить это можно так: package com.zackmercury.test { import flash.display.Sprite; import flash.events.Event; /** * ... * @author ZackMercury */ public class Main extends Sprite { public function Main() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point var numsDrops:Vector.<uint> = new <uint>[0, 0, 0, 0]; var length:int = numsDrops.length; for (var i:int = 0; i < 10000; i ++) { numsDrops[int(Math.random() * length)] ++; } trace(numsDrops.toString()); } } } Больше оборотов Что означает, что шанс выпадения 1 из 4 при использовании Math.random() является 1/4, тоесть, 0.25(что не равно 4%(0.04)) Цитата:
А вот логические операторы( > < == <= >= === <== >== != ! ) возвращают булевые значения, это же основы.
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 12.03.2017 в 16:07. |
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Да с логическими операторами фейланул, просто не сразу втыкнул xD
Спасибо всем за разъяснение)) |
|
|||||
Регистрация: Jan 2012
Сообщений: 836
|
Не пойму. Даже когда percent выставлена в 5%(0.05), на 5-10 раз выпадает true, это просто нереально часто. Через for, вроде бы нормально генерирует, то есть на 20 раз, у меня 4 раза вернуло true, но когда функция вызывается в тот момент, когда это нужно, то чаще всего при низком проценте, возвращает true. Такое чувство, что эти 5% каким то образом превращаются в 25%. Хоть уменьшай всё до 1% и ниже
Последний раз редактировалось Godwarlock; 28.03.2017 в 23:59. |
|
|||||
Регистрация: Apr 2009
Сообщений: 409
|
рандом есть рандом. можешь попробовать другой
|
Часовой пояс GMT +4, время: 06:48. |
|
« Предыдущая тема | Следующая тема » |
|
|