我有这个代码:
srand(time(NULL)); int n = rand() % 1 + 0; printf("%d\n", n);
但是,如果我把它(不是srand(time(NULL)))放在一个循环中,例如,它只生成一个序列0。有另一个实现的随机数之间的0和1或我忘记了什么?
srand(time(NULL))
v64noz0r1#
如果你的意思是0 * 或 * 1,你的%是有意义的,但你的意思是% 2(或& 1)。当然,+ 0仍然是毫无意义的,不知道你的目标是什么。对于0或1的整数结果,只需执行以下操作:
%
% 2
& 1
+ 0
const randomBit = rand() % 2;
编译器可能会"strength-reduce"到:
const randomBit = rand() & 1;
另外,请确保在程序中只调用srand() * 一次 *,否则它不会产生预期的效果。
srand()
bd1hkmkf2#
如果你想要0或者1,就这么做吧
int n = rand() % 2
如果兰德返回的是偶数,你会得到0,如果是奇数,你会得到1。
zkure5ic3#
int n = rand() % 1 + 0;
将产生0总是作为rand() % 1给出0(rand()%a生成0到a-1之间的数字)。
0
rand() % 1
rand()%a
a-1
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,则有效。
ar5n3qh55#
std::srand(time(0)); //Randomise seed initialisation for (int rows = 0; rows < n; rows++) { int randNum = rand() % 2; }
5条答案
按热度按时间v64noz0r1#
如果你的意思是0 * 或 * 1,你的
%
是有意义的,但你的意思是% 2
(或& 1
)。当然,+ 0
仍然是毫无意义的,不知道你的目标是什么。对于0或1的整数结果,只需执行以下操作:编译器可能会"strength-reduce"到:
另外,请确保在程序中只调用
srand()
* 一次 *,否则它不会产生预期的效果。bd1hkmkf2#
如果你想要0或者1,就这么做吧
如果兰德返回的是偶数,你会得到0,如果是奇数,你会得到1。
zkure5ic3#
将产生
0
总是作为rand() % 1
给出0
(rand()%a
生成0
到a-1
之间的数字)。z18hc3ub4#
如果速度是一个问题,因为调用兰德()相对较慢,您可以仅在需要的每31个值时调用它一次,并使用位移位来访问每个rand()调用返回的31位随机数的每个位(0或1)。(第32位是符号位,因为它是正整数,所以总是0。
在我的MacBook上,与每次调用兰德()(21.45秒)相比,使用位移位行时,以下代码的运行速度快29倍(0.74秒)。
“每次调用兰德()”解决方案可以使用其他算法(例如Mersenne Twister)来更快地实现。此外,此解决方案可能依赖于机器,如果兰德_MAX==2^31-1,则有效。
ar5n3qh55#