C-使用rand()时输出随机数在范围内



我的具体问题是,当我输入90个范围(例如 value(和100的范围为更高的值,我得到输出数字有时小于90。In my code below , x<y. 我的代码是:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Null 0
void main(){
    int x,y,a,b;
    printf("Insert two numbers to create a rangen in which you want a random number to be generated:n");
    scanf("%d%d",&x,&y);
    srand(time(Null));
    a =( rand() + x)%y ;
    printf("The Randomly Generated Number is %d.n",a);

}

假设您想要一个独家上限的正确方法是:

(rand() % (high - low)) + low

假设高= 100且低= 90,走过它的工作方式:

  • 您生成一个随机int
  • (高 - 低(为您提供范围100-90 =10。
  • 当您到10%时,您将获得[0,10(的结果,因此它将是0、1、2、3、4、5、6、7、8或9
  • 因为您真正想要的是90、91、92,...,99您必须将low添加回到它

这里要注意的是,您只会得到[90,99]。如果您想拥有一个包含的上行,所以[90,100],您想在

的修改金额中添加1个
(rand() % (high + 1 - low)) + low

您必须将此公式用于y独家(a [x,y [(:

a = (rand() % (y - x)) + x;

和y包含y的这个(a in [x,y](:

a = (rand() % (y - x + 1)) + x;

编辑:应该是:

if (x == y) a = x
else a = (rand() % (y - x)) + x

假设您需要一个实际的随机分发...psudeocode

range = high - low
r = rand()
while (r > range)
{
    r=rand();
}
r+=low;

类似的东西应该通过拒绝范围内的物体来为您提供统一的分布,因为使用mod n,n rand域上的所有值的所有值都没有统一的分布(0RAND_MAX,这是我的C库上的0x7fffffff(。

让我们以0xf的人为示例为域:

如果您对范围内的每个值进行rand() % 10 ...然后你得到:0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5。有2*为0,1,2,3,4,5,为6,7,7,8,9 ...

通过进入较大的域,您会获得更光滑的发行版,但是如果您不通过干净的rand_max 1

进行修改,它将永远是块状的

取决于您正在工作的数字以及兰德的速度,您可以做一些简单的事情,或者您可以将其丢弃以上的数字以上,而不是除以除以您的除数...因此,如果您要分开,则将所有内容丢弃在0x7fffffff上到10来摆脱偏见。

最新更新