我想做的是创建一个函数,该函数接受一个参数,该参数是随机生成应该创建的数字的限制.我经历过一些生成器只重复生成一遍又一遍的数字.
如何创建一个不会连续返回相同数字的生成器.有人可以帮助我实现我的目标吗?
int randomGen(int max)
{
int n;
return n;
}
Run Code Online (Sandbox Code Playgroud)
获得均匀分布结果的最简单方法rand是这样的:
int limited_rand(int limit)
{
int r, d = RAND_MAX / limit;
limit *= d;
do { r = rand(); } while (r >= limit);
return r / d;
}
Run Code Online (Sandbox Code Playgroud)
结果将在范围0to limit-1,并且每个将以相等的概率发生,只要0通过RAND_MAXall 的值与原始rand函数具有相等的概率.
其他方法,如模块化算术或没有使用循环的分割引入偏差.通过浮点中间体的方法不能避免这个问题.从中获得良好的随机浮点数rand至少同样困难.如果你想要随机浮动,使用我的函数进行整数(或改进它)是一个很好的起点.
编辑:这是对偏见的意思的解释.假设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弹出的可能性是其两倍如果您尝试重新缩放和除法,则会发生类似的现象,例如使用rand()*(double)limit/(RAND_MAX+1)Here,0和1映射到0,2和3映射到1,4映射到2,5和6映射到3,并且7个地图到4个.
这些影响在某种程度上可以减轻RAND_MAX,但如果limit很大,它们可以回来.顺便说一下,正如其他人所说的那样,线性同余PRNG(典型的实现rand),低位倾向于表现得非常糟糕,因此当limit2的幂时使用模运算可以避免我描述的偏差问题(因为limit通常划分)RAND_MAX+1在这种情况下均匀地),但你遇到了一个不同的问题.