写函数rand30()使用统一分布的rand100()返回1到100

ran*_*111 -4 algorithm

请尝试编写rand30()应返回1到30的函数.

你有rand100()功能.

Hen*_*nry 6

假设函数返回整数:

int r = rand100();
while (r > 90) {
    r = rand100();
}
return 1 + (r - 1) % 30;
Run Code Online (Sandbox Code Playgroud)

%运营商意味着模.

为了在我们均匀分布100个输入数字时均匀分布30个输出数字,我们能做的最好是将3个输入数字映射到一个输出数字.必须丢弃剩余的10个输入.

我们多久平均一次调用rand100?1次90%2次9%3次0.9%......

平均值为1.111111

  • 我认为这不是一个好的解决方案.制作用于在相同分布类型之间进行转换的循环,仅用于缩放,这是一种不好的做法.另外,你能证明它会被统一分配吗? (2认同)
  • @dreamzoe:这个或类似的东西是*唯一*获得统一分布的方式.耗时很小,但这是你为均匀性付出的代价.以更多代码为代价,在返回之前调用"rand100"的预期数量可以稍微提高一些.但效率不高. (2认同)