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",y);
    return 0;
}

5. 直接可用的随机数生成函数

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

#define LEAST 7
#define LARGEST 10

int getRandom();
int main(){
    int y = getRandom();
    printf("%d\n",y);
    return 0;
}
int getRandom(){    
    srand((unsigned)time(NULL));
    return rand() % (LARGEST - LEAST + 1) + LEAST; 
}

6. 总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值