Math.random()的概率修饰符

时间:2017-03-28 21:34:12

标签: javascript math random

我想知道创建概率的最佳或最常用的方法是什么。我做了一些研究,并在Math.random()主题上找到了一些有趣的问题和答案,例如:

How random is JavaScript's Math.random?

Generating random whole numbers in JavaScript in a specific range?

我正在寻找一种简单的方法来修改使用Math.random()

值的概率。

例如,我知道Math.floor(Math.random() * 2)是一种在近50%的时间内生成1的有用方法:

-Math.random()生成0(包括)和1(不包括)

之间的随机数

- 如果生成的数字是< 0.5,这个数字乘以2仍然会小于1,所以这个数字.floor()返回0

- 如果生成的数字是> 0.5,这个数乘以2将大于1,所以这个数字.floor()返回1

我想扭曲使用“修饰符”获得1的可能性,这与我获得所需概率的时间差不多......

每次运行代码段时,控制台都会打印命中百分比。正如你所看到的,它们几乎是准确的,但并不完全。我通过反复试验想出了指数修改函数。有什么方法可以让我更准确吗?

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>

1 个答案:

答案 0 :(得分:3)

指数在这里没有意义。后退:[0,1]上均匀分布的数字小于相同范围内的x,概率为x,因此:

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

测试:

&#13;
&#13;
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);
&#13;
&#13;
&#13;