利用静态变量写随机函数

 

 源自:《C Primer Plus》第五版p335

在这个随机函数使用了一个具有内部链接的静态变量。ANSI C程序库提供了rand()函数来产生随机数。有多种产生随机数的算法,ANSI C标准允许C实现使用针对特定机器的最佳算法,不过,ANSI C也提供了一个可移植的标准算法,可以在不同系统中产生随机数。事实上,rand()是一个”伪随机数发生器“,这意味着可以预测数字的实际顺序(计算机不具有自发性),但这些数字在可能的取值范围内均匀分布。

 

s_and_r.cpp程序

 

/*s_and_r -- 包含函数rand1()和srand1()*/
/*		使用ANSI C的可移植算法	*/
static unsigned long int next = 1; //种子
int rand1(void)
{
	//产生伪随机数的魔术般的公式
	next = next * 1103515245 + 12345;
	return (unsigned int) (next/65535) % 32768;
}
void srand1(unsigned int seed)
{
	next = seed;    
}

 

 r_drive1.cpp程序

 

//r_drive1.cpp --测试函数rand1()和srand1()函数
/*与s_and_r.cpp一起编译 */

#include<stdio.h>
//#include<time.h>
extern void srand1(unsigned int x);   //声明外部函数
extern int rand1(void);

int main(void)
{
	int count;
    unsigned int seed;

	printf("enter seed:\n");
	while(scanf("%d",&seed) == 1)
	{
		srand1(seed);     //设置种子
		for(count =0; count < 5;count++)
			printf("%d\n",rand1());    //输入随机数
		printf("next feed(q to quit):\n");
	}
	/*srand1((unsigned int) time(0));   //以系统时间作为种子,每次得到的随机数不一样
    printf("%d\n",rand1());*/
	return 0;
}

 

 运行结果:

 

enter seed:

1

16838

5759

10114

17516

31052

next feed(q to quit):

45

4060

2673

15646

11658

30980

next feed(q to quit):

q

请按任意键继续. . .

 

说明:rand1()函数可得到一个在0到32767范围内的随机数;

 

可以用系统时间来作为种子,则r_drive.cpp可写成如下:

 

//r_drive1.cpp --测试函数rand1()和srand1()函数
/*与s_and_r.cpp一起编译 */

#include<stdio.h>
#include<time.h>     //包含time()函数
extern void srand1(unsigned int x);   //声明外部函数
extern int rand1(void);

int main(void)
{
	
	srand1((unsigned int) time(0));   //以系统时间作为种子,每次得到的随机数不一样
    printf("%d\n",rand1());
	return 0;
} 
 每次运行都会得到以系统时间为种子的随机数。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值