我需要在C中生成随机数[复制](I need to generate random numbers

2019-06-26 23:01发布

可能的重复:
如何生成在C随机数?
实施兰特()
在生成随机Blender3D地形

我需要高质量的随机数在C,但我不知道真正做什么。 我需要能够从1-100得到的数字。 任何帮助或可能指向我在哪里可以找到帮助。

Answer 1:

这是在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;

有些人反对这个公式,因为它使用兰特给出的数字的低位(),并在软件伪随机数生成器,这些往往比高位随机的旧的实现,但在任何现代系统这种方法应该是完全正常的。



Answer 2:

通过“公平分配”,我假定你的意思,你不是一般的满意rand() 在这种情况下,你应该使用产生加密的安全随机数字操作系统的具体方法- /dev/random/dev/urandom Unix上,和(根据您的需要) CryptGenRandomRtlGetRandom在Win32。 在Win32特别是,如果你使用VS2005或更高版本,您可以只使用rand_s



Answer 3:

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

本文介绍的基础,以创建自己的随机数生成器,如果你发现它缺少分布的表现将优于标准C库函数。 它产生更好的传播,因此更随机数。

如果你希望生产的东西不能被反向工程,像扑克网站这是至关​​重要的。



Answer 4:

你可以尝试这样的事情:

main()
{
  srand(time(0));

  for(int i=0;i<1000;++i)
    printf("%f ", ((float)rand())/RAND_MAX*99+1);

  return 0;
}

这是作为一个均匀分布为标准兰特()可以给。



Answer 5:

标准C库具有兰特这可能就足够了,除非你有需要与特定统计分布的PRNG ..



Answer 6:

作为一个高品质的随机数生成器, 不要使用rand()或不保证质量的代码。 这是非常容易错误地生成随机数(查看Knuth的有趣的故事,在“计算机程序设计艺术:半数值算法”)。 进行最简单的方法也许是使用发电机在GNU的科学图书馆 。 它安装与*马钱一个点击,并有在GSL到Windows的多个端口。 我用它。 这是很容易调用和行之有效的。



Answer 7:

其他职位有很好的建议。 如果你真的想潜入随机数生成的胆量,看看在C数字食谱 。 先从第7章 。



Answer 8:

如果你真的需要彩票品质的随机数,我不认为你想有一个数字算法都没有。

你想要一个实际的物理过程。 见Random.org。 你愿意付出?

谨防程序随机数生成器,如果你真的需要随机数。 正如我们在回答到目前为止看到,它不仅难写一个好的随机(),它是很难弄清楚如何通过模数或通过缩放正确使用输出它,无论是。 即使代码,人们看到的是“显而易见”的,结果往往是不正确巧妙。

取整数到浮点或双精度只能在浮点数字的所有怪癖带来的(如他们表示接近零比接近一个更多的数字能力)。


你有什么要求? 将您的号码需要认证? 或者你只是真正好的随机数? 你会采用什么测试,看看你的随机数发生器是“好不好?”



文章来源: I need to generate random numbers in C [duplicate]
标签: c random