c++中产生不重复的随机数
答案:5 悬赏:30 手机版
解决时间 2021-03-28 03:08
- 提问者网友:呐年旧曙光
- 2021-03-27 12:46
c++中产生不重复的随机数
最佳答案
- 五星知识达人网友:雾月
- 2021-03-27 13:20
【解题思路】
这个题目要解决两个问题:一是产生随机数;二是不能重复。
●第一个问题:产生随机数。在C++中要产生随机数必须用到两个函数:srand()和rand()函数,使用这两个函数必须包含头文件。其中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 //控制台操作头文件
#include //随机函数头文件
int main() //主函数
{int A[10],i; //整型数组和变量声明
srand((int)time(NULL)); //设置系统时间为随机种子
for(i=0;i<10;i++) //产生10个随机数
{A[i]=1+rand()%10; //得到随机数(范围在1-10之间)
for(j=0;j if(A[i]==A[j]) {i--;break;} //如果重复,重新产生随机数
}
printf("10个1-10的随机数):
");
for(i=0;i<10;i++) printf("%d",A[i]); //显示10个随机数
system("PAUSE"); //屏幕暂停,以便看到显示结果
return 0; //结束程序
}
----------------------------------
下面的代码可以很好帮助初学者理解随机数,也发出来供参考
【程序代码】
#include //控制台操作头文件
#include //随机函数头文件
int main() //主函数
{int A[10],B[10],C[10],D[10],i,j; //整型数组和变量声明
printf("第一批十个随机数(程序每次运行都相同):
");
for(i=0;i<10;i++) //产生并显示10个随机数
{A[i]=rand(); //得到随机数
printf("%d ",A[i]);} //显示随机数
printf("
"); //换行
srand((int)time(NULL)); //设置系统时间为随机种子
printf("第二批十个随机数(每次运行数值都不同):
");
for(i=0;i<10;i++) //产生并显示10个随机数
{B[i]=rand(); //得到随机数
printf("%d ",B[i]);} //显示随机数
printf("
"); //换行
printf("第三批十个随机数(10-29,可能重复):
");
for(i=0;i<10;i++) //产生并显示10个随机数
{C[i]=10+rand()%20; //得到随机数(%是取余运算符)
printf("%d ",C[i]);} //显示随机数
printf("
"); //换行
for(i=0;i<10;i++) //产生并显示10个随机数
{D[i]=10+rand()%20; //得到随机数
for(j=0;j if(D[i]==D[j]) {i--;break;} //如果重复,重新产生随机数
}
printf("第四批十个随机数(10-29,不会重复):
");
for(i=0;i<10;i++) printf("%d",D[i]); //显示10个随机数
printf("
"); //换行
system("PAUSE"); //屏幕暂停,以便看到显示结果
return 0; //结束程序
}
【运行结果】
以上程序在DEV C++运行通过。
这个题目要解决两个问题:一是产生随机数;二是不能重复。
●第一个问题:产生随机数。在C++中要产生随机数必须用到两个函数:srand()和rand()函数,使用这两个函数必须包含头文件
●第二个问题:不重复。这个问题系统没有提供现成的函数,只能由编程者使用程序来实现。实现的方法就是把每一个得到的随机数保存起来,然后当有新的随机数产生的时候一个个比较,如果出现重复就重新产生随机数。
像本题要求随机输出1-10十个不同的随机数,就是既要限定范围,又要不能重复,程序段如下:
【程序代码】
#include
#include
int main() //主函数
{int A[10],i; //整型数组和变量声明
srand((int)time(NULL)); //设置系统时间为随机种子
for(i=0;i<10;i++) //产生10个随机数
{A[i]=1+rand()%10; //得到随机数(范围在1-10之间)
for(j=0;j if(A[i]==A[j]) {i--;break;} //如果重复,重新产生随机数
}
printf("10个1-10的随机数):
");
for(i=0;i<10;i++) printf("%d",A[i]); //显示10个随机数
system("PAUSE"); //屏幕暂停,以便看到显示结果
return 0; //结束程序
}
----------------------------------
下面的代码可以很好帮助初学者理解随机数,也发出来供参考
【程序代码】
#include
#include
int main() //主函数
{int A[10],B[10],C[10],D[10],i,j; //整型数组和变量声明
printf("第一批十个随机数(程序每次运行都相同):
");
for(i=0;i<10;i++) //产生并显示10个随机数
{A[i]=rand(); //得到随机数
printf("%d ",A[i]);} //显示随机数
printf("
"); //换行
srand((int)time(NULL)); //设置系统时间为随机种子
printf("第二批十个随机数(每次运行数值都不同):
");
for(i=0;i<10;i++) //产生并显示10个随机数
{B[i]=rand(); //得到随机数
printf("%d ",B[i]);} //显示随机数
printf("
"); //换行
printf("第三批十个随机数(10-29,可能重复):
");
for(i=0;i<10;i++) //产生并显示10个随机数
{C[i]=10+rand()%20; //得到随机数(%是取余运算符)
printf("%d ",C[i]);} //显示随机数
printf("
"); //换行
for(i=0;i<10;i++) //产生并显示10个随机数
{D[i]=10+rand()%20; //得到随机数
for(j=0;j if(D[i]==D[j]) {i--;break;} //如果重复,重新产生随机数
}
printf("第四批十个随机数(10-29,不会重复):
");
for(i=0;i<10;i++) printf("%d",D[i]); //显示10个随机数
printf("
"); //换行
system("PAUSE"); //屏幕暂停,以便看到显示结果
return 0; //结束程序
}
【运行结果】
以上程序在DEV C++运行通过。
全部回答
- 1楼网友:掌灯师
- 2021-03-27 16:14
用rand()函数,你先网上看看rand()是怎么用的,注意它是伪随机,初始化种子要设好,网上查下资料多想下就知道了。接着是,你要不同的10个数。你可以设个数组存储已经产生的数。比如已经产生了第一个数5,你用rand()生成了又一个5时,比较一下以产生的数发现是5,就跳过,看下一个。总能产生10个不同的随机数。 缺点是rand()不够好,而且算法不够优化,但是能满足你的要求,就10个数,不影响效率。如果你要上万个不一样的就要好好优化算法了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯