我该如何生成一个在0和1之间的随机数?
我该如何生成一个在0和1之间的随机数?
您可以使用stdlib.h来生成伪随机数。只需包含 stdlib,然后调用
double random_number = rand() / (double)RAND_MAX;
[0.00,0.01]
包含的元素比集合 [0.99,1.00]
多得多。这是因为 1E-100>0
但是 1-1E-100 == 1
。对于许多应用程序,可以通过设置 p(x) = 1.0/(_nextafter(x)-x);
来抵消这种影响,尽管这在技术上适用于范围 [0.0,1.0)
。结果是 p(x) 取决于 x,但是 SUM[0<=i < x](p(i)) == x
。 - MSaltersdouble arr[11] = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 }; return arr[rand % 11];
也可以正常工作。 - MSalterssrand(time(NULL));
foo = rand() & 1;
受评论启发的修改:
旧的rand()
实现有一个缺陷 - 低位比高位的周期要短得多,因此在这种实现中使用低位并不好。
如果您知道您的rand()
实现存在此问题,请使用高位,像这样:
foo = rand() >> (sizeof(int)*8-1)
在假定每字节有8位的普通体系结构下
rand()
的结果,以解决线性同余生成器的问题。 - Christophrand()
使用了所有的32位?例如在MSVC上,RAND_MAX
是0x7fff(http://msdn.microsoft.com/en-us/library/2dfe3bzd%28VS.80%29.aspx)。请注意,这个翻译保留了原文中的所有信息和意思,同时使其更加通俗易懂。 - kennytmrand() >> (sizeof(int)*CHAR_BIT-1)
,则无需假定每个字节为8比特。 - Philip Potter(rand() >> RAND_SHIFT) & 1
并在编译时检查 RAND_MAX > (1 << RAND_SHIFT)
;或者,如果 RAND_MAX
的形式为 2^n - 1
,则可以使用 rand() / ((RAND_MAX + 1) >> 1)
来获取最高有效位;你可以再次通过 (RAND_MAX & (RAND_MAX + 1)) == 0
在编译时进行检查。 - Christophrand() / (RAND_MAX + 1)
不是总会得到0吗? - kennytm这些函数可在 UNIX 平台上的drand48() 和 erand48() 函数返回非负的双精度浮点数,均匀分布于区间 [0.0, 1.0]。
#include <stdlib.h>
中找到。但它们不在 ANSI C 中,因此(例如)在 Windows 上找不到它们,除非您自己带来实现(例如 LibGW32C)。