c++中产生不重复的随机数

c++中产生不重复的随机数,第1张

【解题思路】

这个题目要解决两个问题:一是产生随机数;二是不能重复。

●第一个问题:产生随机数。在C++中要产生随机数必须用到两个函数:srand()和rand()函数,使用这两个函数必须包含头文件 <stdlib.h>。其中rand()是产生一个伪随机数,比如:int a=rand()函数返回值的取值范围是int类型的取值范围,如果要取得某个范围的随机数,可以通过取余来实现,比如需要小于100的随机数可以这么写:int a=rand()%100需要100-199之间的随机数可以这么写:int a=100+rand()%100。但在使用这个函数之前,还必须通过srand()函数来指定一个随机种子,如果没有指定随机种子,程序每次运行产生的随机数系列和顺序是相同的。而且srand()指定了随机种子之后,可以多次使用rand()函数来产生随机数,而不必每次使用rand()都指定种子。为了确保程序每次运行时的随机种子都不一样,最好的办法是使用系统时间作为随机种子,比如:srand((int)time(NULL))

●第二个问题:不重复。这个问题系统没有提闷腔供现成的函数,只能由编程者使用程序来实现。实现的方法就是把每一个得到的随机数保存起来,然后当有新的随机数产生的时候一个个比较,如果出现重复就重新产生随机数。

像本题要求随机输出1-10十个不同的随机数,就是既要限定范围,又要不能重复,程序段如下:

【程序代码】

#include <iostream>     岁罩裤              //控制台 *** 作头文件

#include <stdlib.h>                   //随机函数头文件

int main()                            //主函数

{int A[10],i,j                       //整型数组和变量声明

 srand((int)time(NULL))              //设置系统时间为随机种子

 for(i=0i<10i++)                    //产生10个随机数

    {A[i]=1+rand()%10                //得到随机数(范围在1-10之间)

     for(j=0j<ij++)                 //判断和前面的数是否重复

         if(A[i]==A[j]) {i--break}  //如果重复,重新产生随机数

    }

 printf("10个1-10的随机数):\n")

 for(i=0i<10i++) printf("%d",A[i]) //显示10个随机数

 system("PAUSE")                     //屏幕暂停,以便看到显示结果

 return 0                            //结束程序

}

----------------------------------

下面的代码可以很好帮助初学者理解随机数,也发出来供参考

【程序代码】

#include <iostream>                   //控制台 *** 作头文件

#include <stdlib.h>                   //随机函数头文件

int main()                            //主函数

{int A[10],B[10],C[10],D[10],i,j     //整型数组和变量声明

 

 乎简printf("第一批十个随机数(程序每次运行都相同):\n")

 for(i=0i<10i++)                    //产生并显示10个随机数

   {A[i]=rand()                      //得到随机数

    printf("%d ",A[i])}              //显示随机数

 printf("\n\n")                      //换行    

 /*上面代码第一次产生10个随机数,因为没有设置随机种子,所以程序每次运行得到的数值都相同*/

 

 srand((int)time(NULL))              //设置系统时间为随机种子

 printf("第二批十个随机数(每次运行数值都不同):\n")

 for(i=0i<10i++)                    //产生并显示10个随机数

   {B[i]=rand()                      //得到随机数

    printf("%d ",B[i])}              //显示随机数

 printf("\n\n")                      //换行    

 /*上面代码第二次产生10个随机数,因为设置系统时间为随机种子,所以程序每次运行得到的数值都会不同,随机种子只需设置一次,下面都不需要再设置*/

 

 printf("第三批十个随机数(10-29,可能重复):\n")

 for(i=0i<10i++)                    //产生并显示10个随机数

   {C[i]=10+rand()%20                //得到随机数(%是取余运算符)

    printf("%d ",C[i])}              //显示随机数

 printf("\n\n")                      //换行    

 /*上面代码第三次产生10个随机数,因为设置了初始值并使用了取余运算符,可以保证产生的随机数在指定范围内,因为没有是否重复的判断,多运行几次,会发现这10个随机数是可能重复的*/

 

 for(i=0i<10i++)                    //产生并显示10个随机数

   {D[i]=10+rand()%20                //得到随机数

    for(j=0j<ij++)                  //判断和前面的数是否重复

        if(D[i]==D[j]) {i--break}   //如果重复,重新产生随机数

    }

 printf("第四批十个随机数(10-29,不会重复):\n")

 for(i=0i<10i++) printf("%d",D[i]) //显示10个随机数

 printf("\n\n")                      //换行     

 /*上面代码第四次产生10个随机数,因为多了判断代码,确保产生的随机数不会重复*/

 

 system("PAUSE")                     //屏幕暂停,以便看到显示结果

 return 0                            //结束程序

}

【运行结果】

以上程序在DEV C++运行通过。

原型:void srand(unsigned int seed)。种子是无符号整型。

使用(unsigned)time(NULL)作为种子可以使每次运行薯握的种子都不同数派庆,产生的随机序列也不同。自己指定一个数作为种子,除非通过某种方法使每次程序羡世运行时该数的值都不同,否则将始终产生相同的随机序列。

如果由系统时间产生种子,一般是这样指定类:

Random random = new Random()

如果陵禅樱需尺丛要输入的参数为种子,这样定义:

int seed = Seed

Random random = new Random(seed)

这袭段个Seed是你的控制值,事先赋予你需要的整数或直接用整数取代。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12555100.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-26
下一篇2025-08-26

发表评论

登录后才能评论

评论列表(0条)

    保存