C语言 随机编号:0或1

qoefvg9y  于 2023-06-28  发布在  其他
关注(0)|答案(5)|浏览(96)

我有这个代码:

srand(time(NULL));
int n = rand() % 1 + 0;
printf("%d\n", n);

但是,如果我把它(不是srand(time(NULL)))放在一个循环中,例如,它只生成一个序列0。有另一个实现的随机数之间的0和1或我忘记了什么?

v64noz0r

v64noz0r1#

如果你的意思是0 * 或 * 1,你的%是有意义的,但你的意思是% 2(或& 1)。当然,+ 0仍然是毫无意义的,不知道你的目标是什么。对于0或1的整数结果,只需执行以下操作:

const randomBit = rand() % 2;

编译器可能会"strength-reduce"到:

const randomBit = rand() & 1;

另外,请确保在程序中只调用srand() * 一次 *,否则它不会产生预期的效果。

bd1hkmkf

bd1hkmkf2#

如果你想要0或者1,就这么做吧

int n = rand() % 2

如果兰德返回的是偶数,你会得到0,如果是奇数,你会得到1。

zkure5ic

zkure5ic3#

int n = rand() % 1 + 0;

将产生0总是作为rand() % 1给出0rand()%a生成0a-1之间的数字)。

z18hc3ub

z18hc3ub4#

如果速度是一个问题,因为调用兰德()相对较慢,您可以仅在需要的每31个值时调用它一次,并使用位移位来访问每个rand()调用返回的31位随机数的每个位(0或1)。(第32位是符号位,因为它是正整数,所以总是0。
在我的MacBook上,与每次调用兰德()(21.45秒)相比,使用位移位行时,以下代码的运行速度快29倍(0.74秒)。

int main() {
    int i, j, r, x=0;
    srand(37843284);
    for(i=0;i<100000000;i++) {
        r = rand();
        for(j=0;j<31;j++) {
            x+=(r>>j)&1; // bit-shifting
            //x+=rand()&1; // call rand() each time
        }
    }
    printf("%i", x);
    return 0;
}

“每次调用兰德()”解决方案可以使用其他算法(例如Mersenne Twister)来更快地实现。此外,此解决方案可能依赖于机器,如果兰德_MAX==2^31-1,则有效。

ar5n3qh5

ar5n3qh55#

std::srand(time(0)); //Randomise seed initialisation
for (int rows = 0; rows < n; rows++) {
    int randNum = rand() % 2;
}

相关问题