【c语言】生成随机数

简介

有时我们想要一些随机的数据,比如生成一个随机数又或者想让数组里的数据随机。
这时候,就需要用c语言里的库函数生成随机数了,下面就介绍如何在c语言生成随机数。

rand()函数

描述

int rand (void)函数返回一个伪随机数,其范围在0-RAND_MAX之间。
RAND_MAX的值依赖于库,不同的库RAND_MAX值不同,但在所有的库中,RAND_MAX至少是32767

这个伪随机数是用一个数(也称为种子(seed)),经过一个算法生成的伪随机数。
rand()函数的默认种子是1;

声明

int rand (void);

参数

无参数

返回值

返回一个在0 - RAND_MAX之间的整数

头文件

stdio.h

示例

1.直接调用rand()函数生成0-RAND_MAX之间的随机数。

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

int main()
{
	int num = rand();
	return 0;
}

输出:

41

2.生成10个0-10之间的随机数:

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

int main()
{
	for (int i = 0; i < 10; i++)
	{
		//调用rand()函数再模11,就能生成0-10之间的数
		int num = rand() % 11;
		//打印
		printf("%d ", num);
	}

	return 0;
}

输出:

8 9 9 1 7 5 5 10 1 0

注意

当你运行了一次代码之后,再运行一次,你会发现生成的随机数是相同的。
这是因为每次执行程序的时候,rand()函数种子是相同的,默认是1。
如果要每次运行都生成不同的种子,那就要用srand()函数设置种子。

srand()函数

描述

void srand (unsigned int seed)用来设置rand()函数的种子。

声明

void srand (unsigned int seed)

参数

unsigned int seed				要设置的种子,类型为无符号整型

返回值

无返回值

头文件

stdio.h

示例

这个种子经常传的参数是time(NULL),因为这个参数是程序运行的时间戳,每次运行程序这个值都不一样。
所以每次运行程序,用rand()函数产生的随机值都不一样。

下面的程序就把time(NULL)作为参数传给srand()函数的参数,并且运行多次运行程序。

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

int main()
{
	//将时间戳time(NULL)作为种子
	srand(time(NULL));
	for (int i = 0; i < 10; i++)
	{
		//生成0-10的随机数
		int num = rand() % 11;
		printf("%d ", num);
	}
	return 0;
}

第一次运行输出:

2 2 9 0 10 10 9 1 6 0 

第二次运行输出:

6 6 6 2 6 9 9 1 7 9 

第三次运行输出:

10 7 4 0 9 3 10 6 2 10 

注意

1.time函数所需头文件为time.h
2.time(NULL)也可以写成(unsigned int)time(NULL),也就是将time()函数的返回值转型成(unsigned int)
不转型也没问题。

生成某一个范围中的随机数

有时候我们需要生成一个范围内的随机数,比如10-20内的随机数。
但库中并没有函数能直接生成一个范围内的随机数。
但利用rand()函数,再加上我们手动处理一下就可以生成一个范围内的随机数。

举个例子:

我们要生成10-20内的随机数:
首先利用rand()函数生成0-10范围内的数,再加10,不就是10-20范围内的数了吗。

代码:

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

int main()
{
	//设置种子
	srand(time(NULL));
	
	for (int i = 0; i < 10; i++)
	{
		//生成10-20范围内的随机数
		int num = rand() % 11 + 10;
		printf("%d ", num);
	}
	
	return 0;
}

输出:

18 17 11 20 16 16 11 15 11 16 

要是我们要生成200到300之间的随机数呢?再抽象一点,生成n-m之间的随机数呢?
其实生成n-m内的数据是有公式可套的,公式如下:
number = rand() % (m - n + 1) + n

就拿生成6-10范围内的随机数举例子:
number = rand() % (10 - 6 + 1) + 6
即:
number = rand() % 5 + 6

分析:rand() % 5的数在0-4范围内,再加6,就在6-10范围内了。

<think>好的,用户想在C语言生成随机数,需要示例代码。首先,我得回忆一下C语言生成随机数的方法。记得要用到rand()和srand()函数,还有时间种子。 用户提供的引用里提到,rand()生成的是伪随机数,所以必须用srand设置种子,通常用当前时间,比如srand(time(NULL))。这样每次运行程序种子不同,生成随机数就更随机了。 接下来,用户可能需要生成特定范围的随机数。比如生成0到9之间的数,可以用rand() % 10。如果是1到4,就取余后加1,像rand() % 4 +1。引用里的示例代码也展示了这些方法。 然后,要确保包含正确的头文件,比如stdlib.h和time.h。时间函数需要time.h,而srand和rand在stdlib.h里。用户可能容易忘记包含这些头文件,导致编译错误。 另外,用户可能想知道为什么每次运行结果会不同。这时候需要解释srand(time(NULL))的作用,因为时间在不断变化,种子不同,随机数序列就不同了。如果不用srand,每次生成随机数序列都是一样的,比如引用中的例子如果注释掉srand,就会重复同样的数。 还需要注意,rand()生成的数范围是0到RAND_MAX,通常是32767。所以如果需要更大的数,可能需要其他方法,但用户的问题可能主要集中在基础示例上。 最后,根据用户提供的引用,示例代码应该包括初始化种子、生成随机数并输出。可能需要展示生成单个随机数和多个随机数的例子,以及如何限制范围。比如用户提供的引用3中的代码,生成1到4的随机数,还有引用5中的生成数组的例子。 检查是否有错误,比如srand的参数应该是unsigned int,time(NULL)返回的是time_t,但srand接受unsigned int,所以可能需要强制转换,像srand((unsigned)time(NULL)),但有些编译器可能自动转换,不过最好显式转换避免警告。 总结步骤:包含头文件,初始化种子,生成随机数,调整范围,输出结果。然后写出示例代码,并解释每个部分的作用。还要提醒用户常见错误,比如忘记初始化种子导致每次生成相同数列。</think>在C语言生成随机数需要使用标准库中的$rand()$函数配合$srand()$函数初始化随机数种子。以下是具体实现步骤和示例代码: --- ### **实现步骤** 1. **包含头文件** ```c #include <stdlib.h> // rand(), srand() #include <time.h> // time() ``` 2. **初始化随机数种子** 使用当前系统时间作为种子,确保每次程序运行时生成不同的随机序列: ```c srand(time(NULL)); // 或 srand((unsigned)time(0)); ``` 3. **生成随机数** - `rand()`生成范围在$0$到$RAND\_MAX$(通常为32767)的整数 - 通过取模运算限定范围: ```c int num = rand() % 范围上限 + 偏移量; ``` 例如生成$1$到$100$的随机数: ```c int num = rand() % 100 + 1; ``` --- ### **示例代码** #### 1. 生成单个随机数 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); // 初始化种子 int random_num = rand() % 10; // 生成0~9的随机数 printf("随机数:%d\n", random_num); return 0; } ``` #### 2. 生成多个随机数(1~100范围) ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand((unsigned)time(NULL)); for (int i = 0; i < 5; i++) { int num = rand() % 100 + 1; // 1~100 printf("%d ", num); } return 0; } ``` --- ### **关键说明** - **种子初始化**:若未调用`srand()`,每次程序运行会生成相同的随机数序列[^3][^4]。 - **伪随机性**:`rand()`生成随机数基于算法,如需更高安全性需使用其他库(如OpenSSL)[^3]。 - **范围控制**:`rand() % n`会生成$0$到$n-1$的整数,若需非零起始值需添加偏移量[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值