C语言中两个集值之间随机整数的生成

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(时间(空));

我希望在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(时间(空));
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
时,它也不起作用。我认为问题已修复。