我的具体问题是,当我输入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域上的所有值的所有值都没有统一的分布(0
到RAND_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来摆脱偏见。