为javascript编写一个真正包容的随机方法

Adr*_*son 15 javascript random math

Javascript的MATH对象有一个随机方法,从set [0,1)0返回,包括1,exclusive.有没有办法返回一个包含1的真正随机方法.

例如

var rand = MATH.random()*2;

if(rand > 1)
{
   rand = MATH.floor(rand);
}

return rand; 
Run Code Online (Sandbox Code Playgroud)

虽然这总是从集合[0,1]返回一个数字,但它并不是真正随机的.

Tre*_*vor 14

这将返回[0,1]包含:

if(MATH.random() == 0)
    return 1;
else
    return MATH.random();
Run Code Online (Sandbox Code Playgroud)

说明:如果第一次调用random()返回0,则返回1.否则,再次调用random,这将是[0,1).因此,它将返回[0,1]全包.

  • 这不是很均匀,但它非常接近. (11认同)
  • 如果第一个random()调用不为0,则第二个random()调用可能为0。 (2认同)

Wil*_*den 8

它是否包含边界应该无关紧要; 事实上,严格来说,你要做的事情并没有多大意义.请记住,在连续概率分布下,获得特定值的概率无论如何都是无穷小的,所以从数学上讲,你永远不会看到1的确切值.

当然,在计算机世界中,RNG的分布并不是真正连续的,所以你"可能"会遇到一个特定的价值(无论这意味着什么),但事实上你依赖于一个限制实数存储的方式提示您解决您尝试解决的任何问题的方法存在的问题.

  • 这并非不可能,因为实际上 RNG 只能生成有限数量的 0 到 1 之间的值(而不是连续体)。然而,这样做在数学上是荒谬的。要么这个练习专门指的是整数,要么这是一个糟糕的问题。此外,扩展离散均匀分布以形成另一个均匀分布也并非易事。Trevor 和 Brian McKenna 的解决方案非常接近,但并不完全一致。 (2认同)

Guf*_*ffa 7

Math.random函数返回0到1之间的随机数,其中0表示包含,1表示独占.这意味着在一个区间中将随机数正确分配为整数的唯一方法是使用独占上限.

要指定包含上限,只需向其中添加一个以使其在计算中独占.这将在7到12之间正确分配随机数,包括:

var min = 7;
var max = 12;
var rnd = min + Math.floor(Math.random() * (max - min + 1));
Run Code Online (Sandbox Code Playgroud)