我想做的是创建一个函数,它接受一个参数,该参数是随机生成应创建的数字的限制。我经历过一些生成器只是一遍又一遍地重复生成的数字。
如何制作一个不连续返回相同数字的生成器。有人可以帮助我实现我的目标吗?
int randomGen(int max)
{
int n;
return n;
}
获得均匀分布结果的最简单方法rand
是这样的:
int limited_rand(int limit)
{
int r, d = RAND_MAX / limit;
limit *= d;
do { r = rand(); } while (r >= limit);
return r / d;
}
结果将在范围内0
to limit-1
,并且只要这些值都以相同的概率出现0
通过RAND_MAX
全部与原始概率相同rand
功能。
我使用的其他方法,例如模运算或无循环除法,介绍bias。通过浮点中间体的方法并不能避免这个问题。从以下位置获取良好的随机浮点数rand
至少同样困难。如果您想要随机浮点数,那么使用我的整数函数(或其改进)是一个很好的起点。
Edit: 这是我对偏见的解释。认为RAND_MAX
是 7 并且limit
是 5。假设(如果这是一个好的rand
函数)表明输出 0, 1, 2, ..., 7 的可能性都是相等的。服用rand()%5
会将 0、1、2、3 和 4 映射到自身,但将 5、6 和 7 映射到 0、1 和 2。这意味着值 0、1 和 2 弹出的可能性是值 3 和 4。如果您尝试重新缩放和除法,例如使用rand()*(double)limit/(RAND_MAX+1)
这里,0和1映射到0,2和3映射到1,4映射到2,5和6映射到3,7映射到4。
这些影响在一定程度上会因RAND_MAX
,但他们可以回来,如果limit
很大。顺便说一句,正如其他人所说,线性同余 PRNG(典型的实现rand
),低位往往表现得非常糟糕,因此在以下情况下使用模运算limit
是 2 的幂可以避免我描述的偏差问题(因为limit
通常会分裂RAND_MAX+1
在这种情况下是均匀的),但是你会遇到一个不同的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)