Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Расчет вероятности (http://www.flasher.ru/forum/showthread.php?t=213976)

Godwarlock 12.03.2017 02:58

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

faraday 12.03.2017 03:28

почему random получается только с целыми чмслами?
Код AS3:

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, но и числа между ними.

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

Код AS3:

var r:Number = Math.random() * 100;
 
if (r < 3.85) {
    // предмет выпал;
}
else {
    // предмет не выпал;
}

Или так

Код AS3:

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

Операция "<" возращает булеановское значение.
http://help.adobe.com/ru_RU/FlashPla...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/FlashPla....html#random()

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

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


Цитата:

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

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

шанс выпадения 1 из 4, 2 из 4, 3 из 4 и 4 из 4 одинаков, так как Math.random() возвращает псевдослучайное число от 0 до 1 без уклона в какую-либо сторону(равномерно).
Проверить это можно так:

Код AS3:

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
Больше оборотов
Код AS3:

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

Код AS3:

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

рандом есть рандом. можешь попробовать другой

Код AS3:

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



Часовой пояс GMT +4, время: 10:20.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.