Math.random() 的概率修饰符

Ada*_* M. 1 javascript random math

我想知道创建概率的最佳或最广为接受的方法是什么。我做了一些研究,发现了一些关于 Math.random() 主题的有趣问题和答案,例如:

JavaScript 的 Math.random 有多随机?

在 JavaScript 中生成特定范围内的随机整数?

我正在寻找一种简单的方法来修改使用 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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

Ry-*_*Ry- 5

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

function randomHit(modifier) {
    return Math.random() < modifier;
}
Run Code Online (Sandbox Code Playgroud)

测试:

function randomHit(modifier) {
    return Math.random() < modifier;
}
Run Code Online (Sandbox Code Playgroud)