0

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;
}

ただし、RAND_MAX が uBound の倍数でない場合、分布はわずかに歪んでいます。

より良い迅速で汚い方法はありますか?

4

1 に答える 1

0

スキューを回避することが重要な場合は、次のようなことを行う必要があります。

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;
}
于 2013-10-31T15:02:33.047 に答える