我需要在C中生成随机数

akw*_*way 4 c random

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

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

Tyl*_*nry 8

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

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

#include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)

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

srand(time(NULL));
Run Code Online (Sandbox Code Playgroud)

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

第3步.获取随机数.

rand()
Run Code Online (Sandbox Code Playgroud)

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

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

int random_number = rand() % range + min;
Run Code Online (Sandbox Code Playgroud)

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

int random_number = rand() % 100 + 1;
Run Code Online (Sandbox Code Playgroud)

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


Pav*_*aev 7

通过"公平分配",我认为你的意思是你一般不满意rand().在这种情况下,您应该使用特定于操作系统的方法来生成加密安全的随机数 - /dev/random或者/dev/urandom(根据您的需要)在Unix和/ CryptGenRandomRtlGetRandomWin32上.特别是在Win32上,如果您使用的是VS2005或更高版本,您可以使用rand_s.


Bli*_*ndy 3

你可以尝试这样的事情:

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

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它是标准 rand() 所能给出的均匀分布。