问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

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

提问网友 发布时间:2023-10-19 16:36
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
5个回答
热心网友 回答时间:2024-05-17 23:16
【解题思路】
这个题目要解决两个问题:一是产生随机数;二是不能重复。
●第一个问题:产生随机数。在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=0;i<10;i++)                    //产生10个随机数
    {A[i]=1+rand()%10;                //得到随机数(范围在1-10之间)
     for(j=0;j<i;j++)                 //判断和前面的数是否重复
         if(A[i]==A[j]) {i--;break;}  //如果重复,重新产生随机数
    }
 printf("10个1-10的随机数):\n");
 for(i=0;i<10;i++) 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=0;i<10;i++)                    //产生并显示10个随机数
   {A[i]=rand();                      //得到随机数
    printf("%d ",A[i]);}              //显示随机数
 printf("\n\n");                      //换行    
 /*上面代码第一次产生10个随机数,因为没有设置随机种子,所以程序每次运行得到的数值都相同*/
 
 srand((int)time(NULL));              //设置系统时间为随机种子
 printf("第二批十个随机数(每次运行数值都不同):\n");
 for(i=0;i<10;i++)                    //产生并显示10个随机数
   {B[i]=rand();                      //得到随机数
    printf("%d ",B[i]);}              //显示随机数
 printf("\n\n");                      //换行    
 /*上面代码第二次产生10个随机数,因为设置系统时间为随机种子,所以程序每次运行得到的数值都会不同,随机种子只需设置一次,下面都不需要再设置*/
 
 printf("第三批十个随机数(10-29,可能重复):\n");
 for(i=0;i<10;i++)                    //产生并显示10个随机数
   {C[i]=10+rand()%20;                //得到随机数(%是取余运算符)
    printf("%d ",C[i]);}              //显示随机数
 printf("\n\n");                      //换行    
 /*上面代码第三次产生10个随机数,因为设置了初始值并使用了取余运算符,可以保证产生的随机数在指定范围内,因为没有是否重复的判断,多运行几次,会发现这10个随机数是可能重复的*/
 
 for(i=0;i<10;i++)                    //产生并显示10个随机数
   {D[i]=10+rand()%20;                //得到随机数
    for(j=0;j<i;j++)                  //判断和前面的数是否重复
        if(D[i]==D[j]) {i--;break;}   //如果重复,重新产生随机数
    }
 printf("第四批十个随机数(10-29,不会重复):\n");
 for(i=0;i<10;i++) printf("%d",D[i]); //显示10个随机数
 printf("\n\n");                      //换行     
 /*上面代码第四次产生10个随机数,因为多了判断代码,确保产生的随机数不会重复*/
 
 system("PAUSE");                     //屏幕暂停,以便看到显示结果
 return 0;                            //结束程序
}
【运行结果】
以上程序在DEV C++运行通过。
热心网友 回答时间:2024-05-17 23:17
算法就是,每生成一个数就与原来生成的数比较,如果有相等的就就重新生成一个数,这样就能保证10个数都不相等了。下面这个程序生成数的范围是0到100:
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define MAX 100
using namespace std;
int main()
{
int arr[10];
int i=0;
bool ret=false;
srand((unsigned)time(NULL));
while(1)
{
arr[i]=rand()%MAX+1;
for(j=0;j<i;j++)
{
if(arr[j]==arr[i])
{
ret=true;
}
}
if(!ret)
{
i++;
ret=false;
}
if(i==10)
{
break;
}
}
while(--i)
{
cout<<arr[i]<<" ";
}
}
热心网友 回答时间:2024-05-17 23:17
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
   vector<int> nums{1,2,3,4,5,6,7,8,9,10};
   random_shuffle(nums.begin(),nums.end());
   copy(nums.begin(),nums.end(),ostream_iterator<int>(cout," "));
   cout<<endl;
}

为1/n的概率

热心网友 回答时间:2024-05-17 23:18
RAND_MAX是32767, 于是rand()/RAND_MAX得到是1/32767~32767/32767, 乘上n依然只有32767个数
可以通过(rand() << 16) | rand(), 即高16位和低16位分别产生随机数的方法得到更大的随机数

另外先保存再取是个空间时间都特低效的办法, 更好的算法可以自己搜一下"C++产生不重复随机数"
热心网友 回答时间:2024-05-17 23:18
因为windows下rand函数取值只有32767个,你可以试试rand()*rand(),这样可以生成32767*32767范围的数!

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

在c++中,怎样用random产生介于某两个数之间的随机整数...6 假眼睫毛怎么卸8 练字的好处都有哪些?3 求好看的修真言情小说154 DNF死灵术士要学投掷精通吗?4 户口迁到老家需要什么流程? 梦见自己家所有花都枯萎,又发出新芽 死灵术士是什么装备精通?82 DNF死灵术士精通什么甲(如皮甲,布甲) 我想把户口从外地集体户口迁回到老家,需要哪些程序 dnf死灵术士加什么精通ne 梦见我养的花都发芽长叶是啥意思? 外地辞职户口迁回老家。需要什么手续材料 外地户口迁回原籍需要哪些手续 太原日化用品在哪里批发17 宝安中心站到天悦龙庭 弘悦阁怎么走 上海六级住宿班,英语六级强化班好不好及多少钱 这个女孩是不是刘亦菲的替身啊,好像啊,谁有她的资料。她叫什么...15 乐视超4x43怎么连接机顶盒4 信用卡办理多长时间可以进行注销?62 当女朋友说看见我越来越烦了是什么意思14 黑格科技对待员工怎样 平安信用卡激活多长时间可以注销6 鲁迅嚼辣椒驱寒的学习体会(50个字)!!急阿!198 论语中君子和小人在一条中同时出现的有哪些,都是什么?9 论语》中&quot;小人&quot;和&quot;君子&quot;分别出现了多少次4 刘亦菲铜雀台吻戏用替身演员 古代时张家和李家有仇吗? 请帮我起一个。带音字的网名。个性点的。最好带着配套的个性签名...12 怎样和糯米粉做汤圆,应该用凉水还是温水369 赛尔号如何打败异能王? 太原日化批发市场在哪里72 你会怎样帮助患有抑郁症的同学?4 张家的牛去了李家的园子,李家主人打牛,主人把腿摔断了,怎么陪赏? 倩女幽魂2有什么交易方法最安全吗?.9 博瑞的真实油耗,1.8T车型油耗多少?14 太原日化用品从哪进货? 倩女幽魂2交易是什么?7 吉利博瑞1.8t相当于多大油耗118 网游倩女幽魂藏宝阁购买帐号安全吗?还有就是怎么交易?28
Top