这是在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()给出的数字的低位,并且在软件伪随机数生成器的旧实现中,这些通常不如高阶位随机,但在任何现代系统上这种方法应该完全没问题.
通过"公平分配",我认为你的意思是你一般不满意rand().在这种情况下,您应该使用特定于操作系统的方法来生成加密安全的随机数 - /dev/random或者/dev/urandom(根据您的需要)在Unix和/ CryptGenRandom或RtlGetRandomWin32上.特别是在Win32上,如果您使用的是VS2005或更高版本,您可以使用rand_s.
你可以尝试这样的事情:
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() 所能给出的均匀分布。
| 归档时间: |
|
| 查看次数: |
67085 次 |
| 最近记录: |