可能重复:
How to generate a random number in C?
implementation of rand()
Generating random terrain in Blender3D
我需要C中的高质量随机数,但我不知道该怎么做。我需要能够从1-100获得数字。任何帮助或者指出我可以找到帮助的地方。
答案 0 :(得分:8)
这是在C中生成均匀分布的随机数的最简单方法:
第1步。请确保包含标准库标头以获取必要的函数原型
#include <stdlib.h>
第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()给出的数字的低位,并且在软件伪随机数生成器的较早实现中,这些通常比高位比较随机,但是任何现代系统这种方法都应该完全没问题。
答案 1 :(得分:7)
通过“公平分配”,我认为你的意思是rand()
一般不满意。在这种情况下,您应该使用特定于操作系统的方法在Unix上生成加密安全随机数 - /dev/random
或/dev/urandom
(取决于您的需要),以及CryptGenRandom
或{{1}在Win32上。特别是在Win32上,如果您使用的是VS2005或更高版本,则可以使用RtlGetRandom
。
答案 2 :(得分:3)
您可以尝试这样的事情:
main()
{
srand(time(0));
for(int i=0;i<1000;++i)
printf("%f ", ((float)rand())/RAND_MAX*99+1);
return 0;
}
它与标准兰德()可以给出的分布一样均匀。
答案 3 :(得分:3)
http://mathworld.wolfram.com/RandomNumber.html
本文介绍了创建自己的随机数生成器的基础知识,如果您发现它缺乏分发,它将胜过标准C库函数。它产生更好的传播,因此更随机的数字。
如果你希望制作一些无法进行逆向工程的东西,比如扑克网站,这一点至关重要。
答案 4 :(得分:2)
标准C库有rand这可能就足够了,除非你需要一个具有特定统计分布的prng。
答案 5 :(得分:2)
作为高质量的随机数生成器,请不要使用rand()
或非质量保证代码。很容易错误地生成随机数(请参阅“计算机编程艺术:精神数学算法”中的Knuth的有趣故事)。最简单的方法是使用the generators in GNU's scientific library。只需单击* nux即可安装,并且有几个GSL到Windows的端口。我用过它。它很容易打电话,效果很好。
答案 6 :(得分:1)
其他帖子有很好的建议。如果你真的想深入了解随机数生成的内容,请看Numerical Recipes in C。从Chapter 7开始。
答案 7 :(得分:1)
如果你真的需要彩票质量的随机数,我认为你根本不需要数字算法。
You want an actual physical process. See Random.org.你愿意付钱吗?
如果确实需要随机数,请注意编程随机数生成器。正如我们在答案中看到的那样,不仅难以编写好的随机(),很难弄清楚如何正确地使用它的输出,无论是通过模数还是通过缩放。即使是人们认为“显而易见”的代码,也经常被证明是微不正确的。
将整数划分为浮点数或双精度数只会带来浮点数的所有怪癖(例如它们能够表示接近零的数字而不是接近于一的数字)。
您有什么要求?您的电话号码是否需要通过认证?或者你只是想要非常好的随机数?您将使用哪些测试来查看随机生成器是否“良好?”