2017-03-28 6 views
1

確率を作成するための最良の方法または最も受け入れられる方法が何であるかを知りたいと思います。私はシンプルを探していますMath.random()の確率変更子

How random is JavaScript's Math.random?

Generating random whole numbers in JavaScript in a specific range?

:私はいくつかの研究を行って、そのようにMath.random()トピックに関するいくつかの興味深い質問と答えを見つけましたを変更すると、Math.random()を使用して値が真となる確率を変更します。

たとえば、私はを知っていますは、時間の1 50%近くを生成するための有用な方法である。

-Math.random()生成された数である-if(含む)0と1(排他的)

間の乱数を生成します< 0.5の場合、2を掛けた数値は1より小さくなりますので、この数値.floor()は0を返します。

- 生成された数値が> 0.5の場合、2を掛けた数値は1より大きいこの数値.floor()は1を返します。

「修飾子」を使用して1を得る確率を歪ませたいと思います。これはcloですあなたが望む確率を得るために来なければなりません。

コードスニペットを実行するたびに、コンソールはヒット率を表示します。あなたが見ることができるように、それらはほとんど正確ですが、それほど正確ではありません。試行錯誤で指数修正機能を思いついた。これをもっと正確にする方法はありますか?

var youHit = Math.floor(Math.random() * 2); 
 
var totalTries = 0; 
 
var hits = 0; 
 

 
var pointNine = 0.9; // you want 90% of tries to hit 
 
var pointEight = 0.8;// you want 80% of tries to hit 
 
var pointSeven = 0.7;// you want 70% of tries to hit 
 
    
 
function probCheck(modifier) { 
 
    var exponent = 1 + (1 - modifier) + (1 - modifier)*10; 
 
    for (var x = 0; x < 100; x++) { 
 
    youHit = Math.floor((Math.pow(modifier, exponent)) + (Math.random() * 2)); 
 
    totalTries += 1; 
 
    if (youHit) { 
 
     hits += 1; 
 
    } 
 
    } 
 
    console.log("final probability check: " + hits/totalTries); 
 
}; 
 

 
probCheck(pointNine); 
 
probCheck(pointEight); 
 
probCheck(pointSeven);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

「正確」が高いほど、ランダム性が低くなります。 – JDB

+0

グローバル変数 'hits'と' totalTries'をリセットしていないので、おそらくグローバルではありません。 – James

答えて

3

指数が本当にここに意味がありません。バックステッピング:上の一様分布番号[0、1)が、確率Xと同じ範囲のX未満である:

function randomHit(modifier) { 
    return Math.random() < modifier; 
} 

テスト:

function randomHit(modifier) { 
 
    return Math.random() < modifier; 
 
} 
 

 
function probCheck(modifier) { 
 
    var totalTries = 100; 
 
    var hits = 0; 
 

 
    for (var x = 0; x < totalTries; x++) { 
 
    if (randomHit(modifier)) { 
 
     hits++; 
 
    } 
 
    } 
 

 
    console.log("final probability check: " + hits/totalTries); 
 
} 
 

 
probCheck(0.9); 
 
probCheck(0.8); 
 
probCheck(0.7);

+0

私はそれを作っているよりもはるかに単純だと感じました...あなたは "同じ値域のxよりも確率が低い" [0、1の一様分布数]をもう一度説明できますか?バツ"? –

+1

@AdamM .: 0から1までの乱数がある場合、その確率は0.6未満です。または0.8および80%、または0.2および20%である。 – Ryan