C语言中两个集值之间随机整数的生成
我希望在C中实现类似于python的random.randint的东西 我会这样做:C语言中两个集值之间随机整数的生成,c,C,我希望在C中实现类似于python的random.randint的东西 我会这样做: #include <stdio.h> #include <stdlib.h> #include <time.h> srand(time(NULL)); int randInt(int lBound, int uBound){ return (rand()%(uBound-lBound+1))+lbound; } #包括 #包括 #包括 srand(时间(空));
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
srand(time(NULL));
int randInt(int lBound, int uBound){
return (rand()%(uBound-lBound+1))+lbound;
}
#包括
#包括
#包括
srand(时间(空));
int-randInt(int-lBound,int-uBound){
返回值(rand()%(uBound lBound+1))+lBound;
}
但是,如果RAND_MAX不是uBound的倍数,那么分布将略微倾斜
有没有一种快速而肮脏的方法更好?如果避免扭曲很重要,那么你需要这样做
int randInt(int lBound, int uBound){
int rangesize = uBound-lBound+1;
if ((rangesize - 1 > RAND_MAX) || (rangesize < 0) || (lBound > uBound)) {
// run in circles, scream and shout
}
int limit;
if (rangesize < RAND_MAX) {
limit = RAND_MAX - (((RAND_MAX % rangesize) + 1) % rangesize);
} else {
limit = RAND_MAX;
]
int rv;
do {
rv = rand();
} while (rv > limit);
return rv % rangesize + lbound;
}
int-randInt(int-lBound,int-uBound){
int rangesize=uBound lBound+1;
如果((rangesize-1>RAND_MAX)| |(rangesize<0)| |(lBound>uBound)){
//绕着圈子跑,尖叫和叫喊
}
整数极限;
如果(范围大小<最大值){
限制=RAND_MAX-((RAND_MAX%rangesize)+1)%rangesize);
}否则{
极限=随机最大值;
]
int-rv;
做{
rv=rand();
}while(rv>limit);
返回rv%rangesize+lbound;
}
为什么不使用srand(time(NULL))
作为种子?该函数是错误的,它应该是(rand()%(uBound lBound+1))+lbound
对使用gnu的gsl\u rng\u uniform\u int?没有兴趣@Alexandre&interjay。谢谢,我错过了这些,并且编辑了question@TomSwifty我不知道它的存在,我会看一看它,但我仍然对其他的解决方法感到好奇。这是一个很好的解决方法,但它有一些问题:它不起作用n平台,其中RAND\u MAX==INT\u MAX
,因为RAND\u MAX+1
将溢出。当uBound lBound>RAND\u MAX
或uBound lBound+1
不适合INT
时,它也不起作用。我认为问题已修复。