我需要在C中生成随机数

时间:2009-07-27 21:56:59

标签: c random

  

可能重复:
  How to generate a random number in C?
  implementation of rand()
  Generating random terrain in Blender3D

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

8 个答案:

答案 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.你愿意付钱吗?

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

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


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