PDA

Просмотр полной версии : Расчет вероятности


Godwarlock
12.03.2017, 02:58
Всем привет. Задался таким вопросом. Есть к примеру игровой предмет, вероятность его выпадения равна 3.85% из 100%. Подскажите метод реализации? Через Math.random получается только с целыми числами и то, выпадение от 1-4(если к примеру шанс выпадения равен 4%) это достаточно большой шанс мне кажется, а собственно нужно использовать наверно другой метод и с учетом сотых, а то и тысячных долей

faraday
12.03.2017, 03:28
почему random получается только с целыми чмслами?
droped=(Math.random()<0.0385)

Godwarlock
12.03.2017, 03:58
Ммм, что-то не пойму, это скобки дают результат возврата boolen-а, обычно просто Math.random без скобок возвращает число? И еще такой вопрос, 0.0385 это 3.85%? А если установить 0.55385, это какая вероятность? 55.385%?

callme
12.03.2017, 09:29
Math.random() возвращает псевдослучайное число n, где 0 <= n < 1.

Причем n — число вещественное, а не целое (Number а не int). То есть функция может вернуть не только 0 или 1, но и числа между ними.

Можно так написать

var r:Number = Math.random() * 100;

if (r < 3.85) {
// предмет выпал;
}
else {
// предмет не выпал;
}

Или так

droped = Math.random() * 100 < 3.85;

Операция "<" возращает булеановское значение.
http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/operators.html#less_than

Извините если по-капитански написал ))

caseyryan
12.03.2017, 12:27
возращает булеановское значение.
булево

callme
12.03.2017, 14:27
caseyryan, спасибки, буду знать :)

ZackMercury
12.03.2017, 15:10
И еще такой вопрос, 0.0385 это 3.85%? А если установить 0.55385, это какая вероятность? 55.385%?
Если бы вы не прогуливали уроки Теории вероятности, то знали бы, что вероятность может пребывать не только в процентной форме, но и в форме дроби. с:

Godwarlock, перед тем как задать вопрос "что возвращает Math.random()", попробуйте обратиться к документации от Adobe, где чётко и ясно на русском языке написано, что он возвращает.
http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/Math.html#random()

Вообще, Math.random без скобок возвращает функцию.

var f:Function = Math.random;
trace(f()); // какое-то случайное значение



Через Math.random получается только с целыми числами и то, выпадение от 1-4(если к примеру шанс выпадения равен 4%) это достаточно большой шанс мне кажется
Довольно забавно, но в этом случае

trace( int ( 1 + Math.random()*4));

шанс выпадения 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());
}
}

}
->

2521,2520,2514,2445

Больше оборотов
for (var i:int = 0; i < 10000000; i ++)
2500448,2498833,2499876,2500843

Что означает, что шанс выпадения 1 из 4 при использовании Math.random() является 1/4, тоесть, 0.25(что не равно 4%(0.04))

это скобки дают результат возврата boolen-а
Скобки не могут ничего возвращать, они просто определяют порядок действий над операндами.
А вот логические операторы( > < == <= >= === <== >== != ! ) возвращают булевые значения, это же основы.

Godwarlock
12.03.2017, 16:31
Да с логическими операторами фейланул, просто не сразу втыкнул xD
Спасибо всем за разъяснение))

Godwarlock
28.03.2017, 23:22
public static function getPercent(percent:Number):Boolean
{
percent = percent / 100;
var percent_result:Boolean = (Math.random() < percent)
return percent_result;
}
Не пойму. Даже когда percent выставлена в 5%(0.05), на 5-10 раз выпадает true, это просто нереально часто. Через for, вроде бы нормально генерирует, то есть на 20 раз, у меня 4 раза вернуло true, но когда функция вызывается в тот момент, когда это нужно, то чаще всего при низком проценте, возвращает true. Такое чувство, что эти 5% каким то образом превращаются в 25%. Хоть уменьшай всё до 1% и ниже

faraday
29.03.2017, 00:20
рандом есть рандом. можешь попробовать другой


private var seed:Number=new Date().getTime();
public function get nextRand():Number{
seed = (seed * 214013 + 2531011) % 0x7fffffff;
return seed/ 0x7fffffff;
}