C语言(rand函数)

C语言(rand函数)

(2006-09-24 20:41:59)
   

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

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之间的随机

5.总结
1)srand()给rand()提供种子
2)srand()中的seed一般由时间函数得,eg srand((UINT)GetCurrentTime()) srand( (unsigned)time( NULL ) ) time()函数得到现在的系统时间...等等

http://blog.sina.com.cn/s/blog_4983d426010005wz.html?retcode=0

来源:(http://blog.sina.com.cn/s/blog_4983d426010005wz.html?retcode=0) - C语言(rand函数)_丁志中_新浪博客
<think> 首先,用户的问题是:“我想获取C语言rand函数的使用方法 请问C语言rand函数的使用方法”。这是关于C语言rand函数的使用方法。 系统级指令要求: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层要求: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - [^1]: rand函数是计算机C语言中的函数,是真正的随机数生成器。即函数int rand(void),它的返回值是[0,RAND_MAX]间的随机整数,RAND_MAX定义在stdlib.h头文件中,其值为2147483647。 - [^2]: C语言——rand函数。这是一个在C标准库<stdlib.h>中定义的函数,用于生成伪随机数,默认情况下,它生成从0到RAND_MAX的伪随机数,其中RAND_MAX是一个常数,通常是32767。函数原型:int rand(void); - [^3]: C语言rand()函数使用。不同的位数的电脑的RAND_MAX数值不同。示例代码:#include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ srand((unsigned)time(NULL)); for (int i = 0; i < 10; ++i) { printf("%0.2f\n",rand()/(RAND_MAX+1.0)); } return 0; } - [^4]: 这个引用是关于函数思想的数学应用,不太相关,我可以忽略它,因为它不是关于rand函数的。 关键点从引用中: - rand函数定义在stdlib.h头文件中。 - 函数原型:int rand(void); - 它生成伪随机数,范围为0到RAND_MAX。 - RAND_MAX的值可能因系统而异,通常是32767或2147483647。 - 为了生成不同的随机序列,需要使用srand函数设置种子,常用time(NULL)作为种子。 - 示例代码展示了如何使用srandrand。 我的回答需要结构化: - 介绍rand函数- 解释头文件包含。 - 描述函数原型。 - 解释如何使用,包括设置种子。 - 提供示例代码。 - 生成相关问题。 - 在引用处添加引用标识。 确保使用中文回答。 步骤: 1. **介绍rand函数**:解释rand函数是什么,它生成伪随机数。 2. **头文件**:需要包含<stdlib.h>。 3. **函数原型**:int rand(void); 返回一个随机整数。 4. **范围**:返回值在0到RAND_MAX之间。 5. **设置种子**:使用srand函数设置种子,以避免每次运行得到相同的序列。常用srand(time(NULL)),需要包含<time.h>。 6. **示例代码**:提供简单的代码示例,展示如何生成随机数。 7. **注意事项**:解释伪随机数的性质,RAND_MAX的可能值。 8. **生成相关问题**:在回答末尾添加相关问题。 添加引用标识: - 在解释时,如果基于引用,添加[^1], [^2], [^3]。 示例代码从引用[^3]: #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand((unsigned)time(NULL)); // 设置随机种子 for (int i = 0; i < 10; ++i) { int random_num = rand(); // 生成随机数 printf("%d\n", random_num); } return 0; } 我可以简化这个代码,只生成整数,而不是浮点数,因为用户关注的是使用方法。 生成相关问题: - 类似示例,如: - 1. 如何生成特定范围内的随机数? - 2. srand函数的参数是什么? - 3. RAND_MAX在不同系统上的值是多少? 结构清晰: - 分步骤或分部分回答。 </think> ### C语言rand函数的使用方法 在C语言中,`rand()`函数用于生成伪随机数,常用于模拟随机事件或游戏开发等场景。以下是其使用方法的详细步骤和说明,确保回答真实可靠。我会基于参考的引用内容逐步解释。 #### 1. **函数基本介绍** - `rand()`是C标准库中的一个函数,定义在`<stdlib.h>`头文件中。它返回一个伪随机整数,范围在$[0, \text{RAND\_MAX}]$之间。 - 函数原型为:`int rand(void);`,其中`void`表示无参数输入[^1][^2]。 - RAND_MAX是一个常量,通常定义为32767(在16位系统中)或2147483647(在32位或64位系统中),具体值取决于编译器和系统位数[^2][^3]。 #### 2. **必需的头文件** - 使用`rand()`前,必须包含`<stdlib.h>`头文件。如果需要设置随机种子(推荐),还需包含`<time.h>`头文件。 - 示例代码开头: ```c #include <stdlib.h> // 包含rand()和srand()函数 #include <stdio.h> // 用于输出函数printf() #include <time.h> // 用于time()函数设置种子 ``` #### 3. **设置随机种子** - `rand()`生成的是伪随机数序列,每次程序运行时会重复同一序列。为避免此问题,需用`srand()`函数设置随机种子。 - 常用方法:使用当前时间(`time(NULL)`)作为种子,确保每次运行序列不同。 - 语法:`srand((unsigned int)time(NULL));` - 如果不设置种子,默认种子为1,导致每次运行结果相同[^3]。 #### 4. **生成随机数** - 调用`rand()`函数即可返回一个随机整数。 - 示例:生成10个随机数并打印: ```c int main() { srand((unsigned)time(NULL)); // 设置随机种子 for (int i = 0; i < 10; i++) { int random_num = rand(); // 生成随机数 printf("随机数 %d: %d\n", i+1, random_num); } return 0; } ``` - 输出结果类似:随机数 1: 18467、随机数 2: 6334等(实际值每次运行不同)[^3]。 #### 5. **注意事项** - **伪随机性**:`rand()`不是真正的随机数生成器,而是基于算法生成的序列。在需要高安全性的场景(如加密),应使用专用库[^1]。 - **范围控制**:如果需要特定范围(如[a,b])的随机数,可用公式: $$ \text{rand\_in\_range} = a + rand() \mod (b - a + 1) $$ 例如,生成[1,100]的随机数:`int num = 1 + rand() % 100;`。 - **性能**:`rand()`是高效的,但频繁调用可能影响性能。在循环中建议缓存结果。 - **系统差异**:RAND_MAX值可能因系统而异,使用前可打印`printf("RAND_MAX = %d\n", RAND_MAX);`验证[^3]。 #### 6. **完整示例代码** 以下是一个生成10个随机整数的完整程序: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 设置随机种子 srand((unsigned)time(NULL)); printf("生成10个随机整数 (范围: 0 到 RAND_MAX=%d):\n", RAND_MAX); for (int i = 0; i < 10; i++) { int num = rand(); printf("%d ", num); } return 0; } ``` 编译运行后,输出类似:`生成10个随机整数 (范围: 0 到 RAND_MAX=2147483647): 1804289383 846930886 ...`。 通过以上步骤,您可以正确使用`rand()`函数生成随机数。如果需要更高级的随机数处理,建议参考C标准库文档[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值