C语言 生成随机数 分析给定范围的随机数生成公式

1. 概述

本文讲述 rand,srand,以及产生固定范围内的随机数。

2. rand 函数

可以使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数,随机生成一个位于 0 ~ RAND_MAX 之间的整数。它的用法如下:

int rand ();

为什么不使用 random() 函数?

具体用例:

#include <stdio.h>
#include <stdlib.h>

int main(){
	int randnum = rand();
	printf("%d\n", randnum);
	return 0;
}

在我的虚拟机上显示的结果是

1804289403

我的虚拟机版本如下

$ cat /proc/version
Linux version 4.18.0-20-generic (buildd@lcy01-amd64-020) 
(gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) 
#21~18.04.1-Ubuntu SMP Wed May 8 08:43:37 UTC 2019

3. 随机种子 srand 函数

rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”。因此在每次计算机启动的时候,种子被确定,所以 rand() 算出来的值就是固定的。

为什么重启计算机就固定了呢?这其中到底有什么样的机制?

如何改变种子?使用 srand 函数,用法如下:

void srand (unsigned int seed);

实例如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
	int testsrand;
	srand((unsigned)time(NULL));    
	testsrand = rand();    
	printf("%d\n", testsrand);    
	return 0;
}

4. 产生固定范围内的随机数

我们经常需要产生给定范围内的随机数。那怎样才能做到呢?其实很简单,只需要借助取模和加法即可。

想象一下,假如我们需要从范围 [a, b] 的随机数 y。底线就是 a。即 x >= a。因此结果变成:

y = r % x + a

因此我们将目光聚焦于 (b - a),rand() 产生的结果 r ,r 对 x 取模的最大值为 (b - a), 因此,x = (b - a + 1)。公式变为:

y = r % (b - a + 1)+ a

实例如下:

/* 生成 [7, 10] 中的随机数 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
    int y;
    srand((unsigned)time(NULL));
    y = rand() % (10 - 7 + 1) + 7;
    printf("%d\n",a);
    return 0;
}

5. 总结

本文学习了 rand,srand,以及产生固定范围内的随机数。
不足之处在于对于一些很深刻的东西,并没有了解得很清楚。希望有机会再去了解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章