我需要在C中生成随机数

可能重复:
如何在C中生成一个随机数?
rand()的实现
在Blender3D中生成随机地形

我需要C中的高质量随机数,但我不知道该怎么做。 我需要能够从1-100获得数字。 任何帮助或可能指向我可以找到帮助的地方。

这是在C中生成均匀分布的随机数的最简单方法:

步骤1.确保包含标准库头以获取必要的函数原型

#include  

步骤2.使用srand()为随机数生成器播种。 种子确定随机数开始的位置。 对于给定的种子,随机数序列将始终完全相同。 这使您可以获得随机且可重现的结果。 如果你不需要它是可重复的,那么播种的好处是当前时间,因此随机序列在每次运行时都会有所不同。

 srand(time(NULL)); 

(如果你这样做,一定要包括time.h)。 此外,除非您生成大量(数百或数十亿)随机数,否则每个程序只运行一次生成器 。 播种经常使序列不那么随机。

第3步。获取随机数。

 rand() 

此函数返回0到RAND_MAX之间的随机数,RAND_MAX是一个定义为相当大的整数的宏。

步骤4.将随机数输入到您想要的范围内。 这样做的一般公式如下:

 int random_number = rand() % range + min; 

范围是您想要选择多少(连续)数字,而min是这些数字中最小的。 因此,要生成介于1和100之间的数字,范围为100,min为1:

 int random_number = rand() % 100 + 1; 

有些人反对这个公式,因为它使用rand()给出的数字的低位,并且在软件伪随机数生成器的旧实现中,这些通常比高阶位更不随机,但在任何现代系统上这种方法应该完全没问题。

通过“公平分配”,我认为你的意思是你通常不满意rand() 。 在这种情况下,您应该使用特定于操作系统的方法在Unix上生成加密安全随机数 – /dev/random/dev/urandom (取决于您的需要),以及Win32上的CryptGenRandomRtlGetRandom 。 特别是在Win32上,如果您使用的是VS2005或更高版本,则可以使用rand_s

http://mathworld.wolfram.com/RandomNumber.html

本文介绍了创建自己的随机数生成器的基础知识,如果发现它缺乏分发,它将胜过标准C库函数。 它产生更好的传播,因此更随机的数字。

如果您希望生产一些无法进行逆向工程的东西,比如扑克网站,这一点至关重要。

你可以尝试这样的事情:

 main() { srand(time(0)); for(int i=0;i<1000;++i) printf("%f ", ((float)rand())/RAND_MAX*99+1); return 0; } 

它与标准rand()可以给出的分布一样均匀。

标准C库有rand ,这可能就足够了,除非你需要一个具有特定统计分布的prng。

作为高质量的随机数生成器, 不要使用rand()或not-Quality-Assured代码。 很容易错误地生成随机数(在“计算机编程艺术:精神数学算法”中查看Knuth的有趣故事)。 最简单的方法是使用GNU科学库中的生成器 。 只需单击* nux即可安装,并且有几个GSL到Windows的端口。 我用过它。 它很容易打电话,效果很好。

其他post有很好的建议。 如果您真的想深入了解随机数生成的内容,请查看C中的Numerical Recipes 。 从第7章开始。

如果你真的需要彩票质量的随机数,我认为你根本不需要数字算法。

你想要一个真正的物理过程。 见Random.org。 你愿意付钱吗?

如果你真的需要随机数,请注意编程随机数生成器。 正如我们在答案中看到的那样,不仅难以编写好的随机(),很难弄清楚如何正确地使用它的输出,无论是通过模数还是通过缩放。 即使是人们认为“显而易见”的代码,也常常被certificate是微不正确的。

将整数划分为浮点数或双精度数只会带来浮点数的所有怪癖(例如它们能够表示接近于零而不是接近于1的更多数字)。


你有什么要求? 您的电话号码是否需要通过认证? 或者你只是想要非常好的随机数? 你会用什么测试来看看你的随机发生器是否“好”?