srand()以及rand()函数用法

srand()就是给rand()提供种子seed

如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的,

srand(n)

for(10)

rand()
也就是说,以一个固定的数值作为种子是一个缺点。 通常的做法是  以这样一句代码srand((unsigned) time(NULL));来取代,这样将使得种子为一个不固定的数, 这样产生的随机数就不会每次执行都一样了。


1,先看一个例子
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main( void )
{
int i;
/* Seed the random-number generator with current time so that
* the numbers will be different every time we run.
*/
srand( (unsigned)time( NULL ) );
/* Display 10 numbers. */
for( i = 0; i < 10;i++ )
printf( " %6d/n", rand() );
}

2.关于time.h
time.h中包含很多有趣的函数,譬如
char *ctime(long *clock)
本函数把clock所指的时间(如由函数time返回的时间)转换成下列格式的
字符串:Mon Nov 21 11:31:54 1983/n/0

#i nclude <iostream>
#i nclude <stdlib.h>
#i nclude <time.h>
using namespace std;


void main()
{
time_t t1,t2;
char getTime[20];
char *ptstring=getTime;

int x,count=0;
x=RAND_MAX;
cout<<<'/n';
t1=time(NULL);
ptstring=ctime(&t1);

while(count<=100)
{
srand( (unsigned)time( NULL ) );
x=rand()%50;
if(x<5)
continue;
else
{
count++;
cout<<"the numth is "<<<'/n';
}
}

查看ptstring的值会显示 "Tue Sep 13 16:31:06 2005"

3, 最后说说srand()函数
void srand(unsigned seed) 初始化随机数发生器

有讨论如下:
1.C的函数库之所以没有把使用系统时钟初始化随机种子这步重要的操作直接放进ran

d函数的实现中,我觉得至少有三个原因:
(1)可以高效产生连续的随机数,不用每次都初始化;
(2)给程序员以更高的灵活性,因为可能在要求较高的场合,应该使用更好的的数据

做种子,而不是系统时钟;
(3)对于只是想产生大量伪随机数来尽兴某种验证或者统计,未必需要初始化,大不

了程序每次运行都产生同样的一系列随机数而已——有些情况下,这是无所谓的。

事实上有一个更重要的原因:
作为伪随机序列产生器的rand()函数,必须具备的一个重要特性就是-》产生的序

列必须是可重现的。
这不仅仅是一个算法,相当大的程度上,它关系到代码测试的准确性。如果算法中

使用了和rand()的结果相关的数据,通过一个可控的可重现序列,我们就有机会再现每一

次测试的过程,从而更有效的找到问题的所在。
所以这里提出一个建议,代码中,如果rand()的函数结果关系到算法的结果,那么

,必须保证你的rand()调用是可重现的。

4,c语言里函数rand()和srand()的用法 - -

rand(void)用于产生一个伪随机unsigned int 整数。
srand(seed)用于给rand()函数设定种子。

srand 和 rand 应该组和使用。一般来说,srand 是对 rand 进行设置。
比如:
srand((UINT)GetCurrentTime());
int x = rand() % 100;
是生成 0 到 100 之间的随机数。

srand()是用来初始化随机种子数的,因为rand的内部实现是用线性同余法做的,他不是真

的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,式子如下


rand = rand*const_1 + c_var;
srand函数就是给它的第一个rand值。

用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的,
比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))   产生一个0到n之间的随机


RAND_MAX=0x7fffffff

5.总结
1)srand()给rand()提供种子
2)srand()中的seed一般由时间函数得,eg srand((UINT)GetCurrentTime()) srand( (u

nsigned)time( NULL ) ) time()函数得到现在的系统时间...等等

 
<think>好的,我现在需要详细解释C++中srandrand函数的使用方法,并提供示例。首先,我得确保自己正确理解这两个函数的作用和区别。 根据引用[1],srand用于设置随机数种子,而rand生成伪随机数。每次调用rand时,如果没有用srand设置种子,会使用默认种子1,导致每次运行生成的随机数序列相同。这解释了为什么在使用rand前通常要用srand配合时间函数来初始化种子,比如srand(time(NULL)),这样每次程序运行时种子不同,生成的随机数序列也会不同。 引用[2]提到srand的参数是unsigned int类型,通常用当前时间作为种子,因为时间每秒变化,确保种子不同。比如srand((unsigned)time(NULL))。而引用[3]中的代码示例展示了如何用srand和time函数生成10个随机数。这里需要注意的是,time(NULL)返回当前时间的时间戳,转换为unsigned int作为种子。 接下来,用户需要使用方法说明和示例。我需要分步骤解释,首先如何包含头文件,然后初始化种子,再调用rand。还要提到rand的范围通常是0到RAND_MAX,如何限制范围,比如使用取模运算。另外,可能需要指出常见错误,比如在循环中多次调用srand,导致种子重复,从而生成不随机的数。 示例部分,应该包括基本用法和配合时间种子的例子。另外,生成特定范围的随机数也很重要,比如1到100之间的数。可能需要指出,取模的方法可能引入偏差,但简单情况下足够使用。 最后,要生成相关问题。可能的问题包括如何生成更安全的随机数(C++11的<random>库)、多次调用srand的问题、RAND_MAX的值,以及srandrand的线程安全性等。 需要确保所有数学表达式正确使用$...$,比如在讨论范围时用$0 \leq \text{rand()} \leq \text{RAND_MAX}$。独立公式可能用不到,但如果有需要的话,比如计算范围,可以用$$...$$。 检查是否有中文回答,结构是否清晰,引用是否正确添加在段落末尾。例如,当提到srand设置种子时,添加[^2],当提到rand生成伪随机数时,引用[^1]。 现在整理步骤: 1. 引入头文件<stdlib.h>和<time.h>(或用C++的<cstdlib>和<ctime>)。 2. 使用srand初始化种子,通常用time(NULL)。 3. 调用rand()生成随机数。 4. 调整范围,如rand() % 100 + 1生成1到100的数。 注意示例代码的正确性,比如在C++中正确使用命名空间和头文件。例如: ```cpp #include <cstdlib> #include <ctime> #include <iostream> using namespace std; int main() { srand(time(0)); // 使用当前时间作为种子 for (int i = 0; i < 5; i++) { cout << rand() % 100 << " "; // 生成0-99的随机数 } return 0; } ``` 另外,要指出错误用法,如在循环内调用srand,导致种子重复: 错误示例: ```cpp for (int i = 0; i < 10; i++) { srand(time(0)); // 错误:每次循环都重置相同的种子 cout << rand() << " "; } ``` 这样可能导致相同的随机数多次出现,因为种子在短时间内可能不变。 总结使用时,强调srand只需调用一次,通常在程序开始时。而rand每次调用生成下一个数。 相关问题可能涉及这些常见错误,或者如何生成更高质量的随机数,比如使用C++11的随机库。</think>### C++中`srand`和`rand`函数的使用方法 #### 1. 函数作用 - **`rand`函数**:生成伪随机整数,范围默认是$0 \leq \text{rand()} \leq \text{RAND\_MAX}$(通常为32767)。 - **`srand`函数**:设置`rand`函数生成随机数时的种子。种子不同,`rand`生成的序列不同。 #### 2. 基本使用步骤 1. **包含头文件**: ```cpp #include <cstdlib> // 提供rand()srand() #include <ctime> // 提供time() ``` 2. **初始化种子**(通常在程序开头调用一次): ```cpp srand(time(0)); // 使用系统时间作为种子 ``` 说明:`time(0)`返回当前时间戳(秒),确保每次运行时种子不同[^3]。 3. **生成随机数**: ```cpp int random_num = rand(); // 生成0到RAND_MAX之间的整数 ``` #### 3. 生成特定范围的随机数 - **示例1**:生成$[0, 99]$的随机数: ```cpp int num = rand() % 100; // 取模运算 ``` - **示例2**:生成$[1, 100]$的随机数: ```cpp int num = rand() % 100 + 1; ``` #### 4. 完整示例代码 ```cpp #include <iostream> #include <cstdlib> #include <ctime> int main() { srand(time(0)); // 初始化种子 std::cout << "5个0-99的随机数: "; for (int i = 0; i < 5; i++) { std::cout << rand() % 100 << " "; } return 0; } ``` #### 5. 常见错误 - **重复初始化种子**: ```cpp for (int i = 0; i < 10; i++) { srand(time(0)); // 错误:种子可能在循环中不变 std::cout << rand() << " "; } ``` 结果可能生成重复的随机数(因为`time(0)`在短时间内的返回值相同)[^3]。 #### 6. 扩展说明 - **`RAND_MAX`的值**:通过`std::cout << RAND_MAX;`可查看,通常为32767。 - **C++11更安全的随机数库**:推荐使用`<random>`头文件中的`std::mt19937`和分布类(如`std::uniform_int_distribution`)生成更高质量的随机数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值