可能的重复:
如何生成在C随机数?
实施兰特()
在生成随机Blender3D地形
我需要高质量的随机数在C,但我不知道真正做什么。 我需要能够从1-100得到的数字。 任何帮助或可能指向我在哪里可以找到帮助。
可能的重复:
如何生成在C随机数?
实施兰特()
在生成随机Blender3D地形
我需要高质量的随机数在C,但我不知道真正做什么。 我需要能够从1-100得到的数字。 任何帮助或可能指向我在哪里可以找到帮助。
这是在C语言产生均匀分布的随机数的最简单的方法:
第1步:一定要包括标准库的头以获取必要的函数原型
#include <stdlib.h>
步骤2.种子使用随机数发生器srand()
。 种子确定其中的随机数开始。 随机数序列将永远是一个给定的种子完全一样。 这可以让你有随机的,但重复的结果。 如果你不需要它是可再生的,与种子的好事是当前时间,这样的随机序列将在每次运行不同。
srand(time(NULL));
(一定要包括time.h中,如果你做到这一点)。 此外, 只有除非你生成一个庞大的数字(千万甚至上亿)的随机数的每个程序运行播种发生器一次 。 经常播种使得顺序随机的 。
第3步:让您的随机数。
rand()
该函数返回0和RAND_MAX,它是被定义为一个相当大的整数的宏之间的随机数。
第4步让你的随机数到你想要的范围。 这样做的一般公式是这样的:
int random_number = rand() % range + min;
凡范围是你要多少(连续)号可供选择,和最小是最小的这些。 所以,以产生1与100之间的数,范围为100和分钟为1:
int random_number = rand() % 100 + 1;
有些人反对这个公式,因为它使用兰特给出的数字的低位(),并在软件伪随机数生成器,这些往往比高位随机的旧的实现,但在任何现代系统这种方法应该是完全正常的。
通过“公平分配”,我假定你的意思,你不是一般的满意rand()
在这种情况下,你应该使用产生加密的安全随机数字操作系统的具体方法- /dev/random
或/dev/urandom
Unix上,和(根据您的需要) CryptGenRandom
或RtlGetRandom
在Win32。 在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;
}
这是作为一个均匀分布为标准兰特()可以给。
标准C库具有兰特这可能就足够了,除非你有需要与特定统计分布的PRNG ..
作为一个高品质的随机数生成器, 请不要使用rand()
或不保证质量的代码。 这是非常容易错误地生成随机数(查看Knuth的有趣的故事,在“计算机程序设计艺术:半数值算法”)。 进行最简单的方法也许是使用发电机在GNU的科学图书馆 。 它安装与*马钱一个点击,并有在GSL到Windows的多个端口。 我用它。 这是很容易调用和行之有效的。
其他职位有很好的建议。 如果你真的想潜入随机数生成的胆量,看看在C数字食谱 。 先从第7章 。
如果你真的需要彩票品质的随机数,我不认为你想有一个数字算法都没有。
你想要一个实际的物理过程。 见Random.org。 你愿意付出?
谨防程序随机数生成器,如果你真的需要随机数。 正如我们在回答到目前为止看到,它不仅难写一个好的随机(),它是很难弄清楚如何通过模数或通过缩放正确使用输出它,无论是。 即使代码,人们看到的是“显而易见”的,结果往往是不正确巧妙。
取整数到浮点或双精度只能在浮点数字的所有怪癖带来的(如他们表示接近零比接近一个更多的数字能力)。
你有什么要求? 将您的号码需要认证? 或者你只是想真正好的随机数? 你会采用什么测试,看看你的随机数发生器是“好不好?”