C语言中互不相同随机数的应用研究

时间:2022-09-21 11:59:26

C语言中互不相同随机数的应用研究

摘要:文章对随机数的应用问题进行了详细的分析, 给出了一种实现的算法, 并用C语言实现。通过该问题的C实现, 可使学习者清晰地观测到解决该问题的全过程。

关键词:随机数; 算法; 随机排序

中图分类号:TP312文献标识码:A文章编号:1009-3044(2008)30-0654-02

Applied Study on Different Random Numbers in C Language

ZHANG Zhi-feng, LV Ying

(Department of Computer Science, Laiwu Vocational & Technology College, Laiwu 271100, China)

Abstract: The paper makes a detailed analysis of the random numbers' application issue, and provides an algorithm for their application in C. Through this application, the learners can observe clearly the whole process of solving the problem.

Key words: random numbers; algorithm; random ordering

1 随机数产生的方法

在编程过程中,随机数有其广泛的应用价值。在C语言中,可以利用C语言中的种子函数srand()和伪随机函数rand()来实现。生成步骤如下:

1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;

2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间);

3) 根据需要多次调用rand(),从而不间断地得到新的随机数;

4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。

范例源程序如下:

#include

void main()

{

int i;

srand((unsigned)time(NULL));

i = rand();

Printf("%d",i);

}

2 实际应用

在c语言中,随机数的产生大致可以分为以下三种情况:1) n个任意的随机数的产生;2) 从n至n+m的m+1个随机数的产生;3) 从n至n+m互不相同的m+1个随机数产生。前两种实现比较简单,在现实生活中应用较少。第三种实现较为复杂,较有实用价值,比如选号,随机排列等。下面以为随机为10个学生分配1-10十个座号为例说明。

3 算法分析

程序中学生对象必须有姓名和座号两个属性,不妨利用结构体来实现。生成座号方法有两种。

先说第一种。实现步骤如下:第一步:在结构体初始化时直接指定学生姓名,座号可暂定为0。第二步:利用随机函数生成学生座号,但生成的数值可能有重复。第三步:利用循环语句生成新的座号,每生成一个新的座号,均需和以前的座号比较,若有重复,则重新生成,直到生成数值和前面所有数值均不相同。

这个算法在座号先生成后判断。生成后立刻作比较,如重复则重新生成。因此,在逐个生成之后即达到了预期目标。这种事算法比较符合人们的逻辑,但需要重复比较,效率较低。

下面说第二种。实现步骤如下:第一步:在结构体初始化时直接指定学生姓名、座号,座号可暂定为0。第二步:定义一个一维数组a[10]存放1-10十个座号,且令a[i]=i+1。第三步:利用循环语句随机生成a数组的第某个元素,如果该元素不等于0,则成为学生的座号。第四步:a数组的第某个元素归零,重新利用循环和判断生成下一个座号。

第二种算法是先判断后生成。思路为先生成一个放置座号的数组,然后从中随机抽取,抽取后为防止重复,立即归零。与第一种算法相比,每次生成座号,只需判断是否为0即可,大大提高了程序执行的效率。

4 C语言实现

4.1 先生成后判断的程序实现

4.1.1 说明

1) 10个学生姓名分别为:A,B,C,D,E,F,G,H,I,J。

2) 10个学生的初始座号均为0。

3) 利用strand()函数和rand()函数产生随机数。

4.1.2编程

#include

struct student

{

char name[10];

int num;

}

stu[10]={"A",0,"B",0,"C",0,"D",0,"E",0,"F",0,"G",0,"H",0,"I",0,"J",0};/*初始化学生信息*/

main()

{

int i,j;

srand(time(0));

for(i=0;i

{

stu[i].num=rand()%10+1;

for(j=0;j

{if(i!=0&&stu[i].num==stu[j].num)

{stu[i].num=rand()%10+1;

j=-1;

}/*重新产生座号*/

}}

for(i=0;i

printf("\n%s:%d\n",stu[i].name,stu[i].num);/*输出结果*/

}

4.2 先判断后生成的程序实现

4.2.1 说明

1) 10个学生姓名分别为:A,B,C,D,E,F,G,H,I,J;初始座号均为0。

2) a数组中存放座号。

3) 利用strand()函数和rand()函数随机抽取a数组的第index个元素。

4) 防止座号重复,a数组的第index个元素用完后立刻归零。

4.2.2 编程

#include

struct student {

char name[10];

int num;

}

stu[10]={"A",0,"B",0,"C",0,"D",0,"E",0,"F",0,"G",0,"H",0,"I",0,"J",0};

main()

{

int a[10],i,index,x=0;

for(i=0;i

a[i]=i+1; /*存放座号*/

srand(time(0));

for(i=0;i

{

index=rand()%10; /*随机抽取座号*/

if(a[index]!=0)

{

stu[i].num=a[index];

a[index]=0;

++i;

}}

for(i=0;i

printf("\n%s:%d\n",stu[i].name,stu[i].num);

}

5 总结

C语言产生互不相同的随机数,主要有两种方式,一种是先生成再判断,一种是先判断再生成。需要注意的是:前者要在判断过程中要逐一比较,不可遗漏。程序中的j=-1和循环中的j++相结合,正好从stu[0].num开始比较。后者要先建立一个数组来存放座号,然后才能随机抽取。

参考文献:

[1] 谭浩强. C语言程序设计[M]. 北京:清华大学出版社,2006.

[2] 严蔚敏. 数据结构(C语言版)[M]. 北京:清华大学出版社.2007.

[3] 方风波. C语言程序设计[M]. 北京:地质出版社,2006.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:计算机网络课程教学的研究 下一篇:基于VC++变电站自动化图形界面模块的设计与实...