产生不重复的随机数

产生n个不重复的随机数 一.去重法        这是最容易想到的方法,逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。可以使用hashtable或数组标记,这种方法效率比较低,且比较次数呈线性增长,越往后次数越多。 二.筛选法        所谓“筛选法”就是根据要产生随机数指定的范围(起始数必须小于终止数),将这些数全部装入一个数组,然后利用系统随机函数(比如 Random )随 阅读详情
看到这个问题了:
随机取 m 个数(在 1 到 n 的范围之内),(m <= n),要求 m 个数没有重复。
有没有什么好的算法,时间复杂度和空间复杂度都很好。


// 随机取 m 个数(在 1 到 n 的范围之内),(m <= n),要求 m 个数没有重复。
// 有没有什么好的算法,时间复杂度和空间复杂度都很好。
// 方法 1 :生成一系列的随机数,重复的丢弃,利用 STL 的 set 可以方便地插入非重复元素。
// 缺点是浪费时间。
// 方法 2 :洗牌算法,用一个数组保存 1,2, 。。。,n 这些数,然后历遍数组,每次生成一个
// 随机数,作为下标,交换当前元素。然后取数组的前 m 个元素。缺点是浪费空间。
// 2007-07-23
// By rappizit@yahoo.com.cn

#include 
<iostream>
#include 
<set>
#include 
<vector>
#include 
<stdlib.h>
#include 
<time.h>
using namespace std;

void randomNexclusive(int n, int m)
{
    
if (n < m)
        
{
        
return;
        }

    
int r;
    
set <int> s;
    
while (1)
        
{
        r 
= rand () % n + 1;
        s.insert (r);    
// set 底层实现是红黑树,插入复杂度是对数级的
        if(s.size () == m)
            
{
            
break;
            }

        }

    copy (s.begin (), s.end (), ostream_iterator 
<int> (cout, " "));
    cout 
<< endl;
}


void shuffle (int n, int m)
{
    
if (n < m)
        
{
        
return;
        }

    vector 
<int> v (n + 1);
    
int r, i;
    
for (i = 1; i <= n; i ++)
        
{
        v [i] 
= i;
        }

    
for (i = 1; i <= n; i ++)
        
{
        r 
= rand () % n + 1;
        swap (v [i], v [r]);
        }

    
for (i = 1; i <= m; i++)
        
{
        cout 
<< v [i] << " ";
        }

    cout 
<< endl;
}


void main ()
{    // 此句必不可少,否则生成相同序列,放到函数 randomNexclusive () 里面也不好
    srand ((unsigned) time (NULL));    
    randomNexclusive (
1000, 100);
    cout 
<< endl;
    shuffle (
1000, 100);
}

不过我认为这两个算法都还是能够满足一般要求的。
如何产生n个不重复的随机数 问题:如何得到n个互相不重复的随机数? 如何实现randperm(n)的效果呢?本文提供了三种思路。 阅读详情

相关推荐

自动化测试工具playwright中文文档-------1.编写测试

Playwright 测试非常简单,它们执行操作,并断言状态是否符合预期。在执行任何操作之前,无需等待任何内容:Playwright 在执行每个操作之前会自动等待一系列可操作性检查通过。此外,在执行检查时也不需要处理竞态条件——Playwright 的断言设计方式能够描述最终需要满足的期望。就这样!这些设计选择允许 Playwright 用户完全忘记他们测试中的不稳定超时和竞态检查。您将学习如何编写第一个测试如何执行操作如何使用断言测试如何在隔离环境中运行如何使用测试钩子。

2301_76646967的博客 2508

生成全不相同的随机数

定义一个数组,有是个成员,存储10个不同的从0~9的随机数,代码如下。在G++下测试通过。 #include #include #include using std::cout; using std::endl; const int nrNum = 10; void get_rand(void); void get_rand(int A[], int size) {

Tyrion Lannister's Special column 741

MOSFET高频响应实战:如何用LTspice仿真内部电容效应(附模型文件)

本文深入解析MOSFET高频响应中的内部电容效应,通过LTspice仿真工具详细展示如何提取模型参数并优化高频特性。从栅极相关电容到结电容的物理本质,再到实战案例中的开关损耗分析和频率响应扫描,提供全面的设计优化方法,帮助工程师有效应对高速开关电路中的电容挑战。

weixin_33725722的博客 390

生成无重复的随机数

  摘自:http://www.cppblog.com/pengkuny/archive/2006/11/12/15057.html生成无重复的随机数,注意,是不重复的序列.   通常的生成随机数的做法是不考虑重复的,因为即使重复也属于概率意义上的正常情况.但某些情况下需要不重复的随机数据,怎么办呢?   我想从大方向上来说,应该只有两个方法.要么牺牲时间要么牺牲空间.讲得不对或不完整,大家一

SearchLife的专栏 1618

Zemax:初学者的混合模式

光线以序列模式开始,然后接近非序列组件的入口端口。到达入口端口后,光线以非序列模式传播,然后接近出口端口。光线离开出口端口后,我们又回到序列模式。在此博客中,使用混合模式的示例将演示根据您自己的需要复制此工作流程所需的基本设置,以及一些有用的技巧。非序列组件表面类型必须在序列模式和非序列模式下定义。为了定义非序列组件的几何形状,请转到设置->编辑器->非序列,单击非序列编辑器。一旦我们进入非序列组件编辑器:表面 2 上的组件组,找到一个对象类型并进行定义。它能让您兼具序列模式的精确性和非序列模式的灵活性。

jkh920184196的博客 1340

RNA-seq分析:Step8(富集分析)

RNA-seq富集分析是一种用于分析基因表达数据中特定基因或通路是否富集的分析方法。其基本思想是比较不同基因对应的转录本/基因之间的表达差异及其对应的基因注释信息,通过统计学方法评估差异的显著性,从而确定是否存在某些特定的功能通路或基因集合富集的情况。常用的RNA-seq富集分析工具包括GOseq、KEGG(KEGG enrichment analysis)、DAVID(Database for Annotation, Visualization and Integrated Discovery)等。这

沉香best的博客 3633

R语言处理数据——生成随机数

生成随机数 #如下连续生成16组1:3的随机不重复整数(每次3个),存储至repl中: repl <- NULL for(x in 1:16) {repl <- c(repl, sample(1:3, 3, replace = F))}

小八四爱吃甜食的博客 3213

腾讯音乐 QQ音乐商业化客户端开发工程师:岗位深度解析与面试攻略

腾讯音乐QQ音乐商业化客户端开发工程师岗位要求3年以上Android开发经验,熟练掌握Kotlin/Java及跨端开发技术。核心职责包括QQ音乐客户端功能开发、架构优化、性能提升及技术攻关。岗位要求计算机相关本科以上学历,具备完整项目开发经验,熟悉TCP/IP等网络协议,能独立解决复杂技术问题。面试重点考察项目经验、架构设计、性能优化及新技术研究能力,建议候选人准备具体案例,量化成果,并熟悉Flutter等跨端技术。该职位强调技术深度与产品思维的结合,需展现扎实的编程基础、问题解决能力和团队协作精神。

郑伟强dev的专栏 366

RAP简介教程&常用规则

上篇文章浅谈了mock数据的工具对比,在实际使用过程中,需要mock的数据包含各种语法规则、数据规律等等,最完善的规则建议还是参考MOCK.js教程,但是,这里就需要了解下RAP在使用时常用的一些写法了。 首先我们先看下RAP的整个页面: 日常使用主要涉及几个模块: 接口简介 主要是接口地址、接口类型等等 请求参数 可以分为三类: 1、headers:一般头部放置验证参...

weixin_33937913的博客 3433

9篇1章1节:中国居民健康与营养调查(CHNS)数据库的官网解析和数据下载(2026年版)

在探讨中国社会经济转型与人口健康变迁的学术领域中,中国健康与营养调查(CHNS) 是一个无法绕过的权威数据库。本文将带你深入了解CHNS的项目背景、庞大的数据体系,以及如何通过这两个核心网站获取关键的家庭、个人及社区层面的研究数据。

MD Code 1698

【人工智能论文发表】基于医学病例文本和多模态大模型的医疗影像分割方法研究

摘要:本研究提出MMS-Former,一种基于级联多模态Transformer的文本引导医学图像分割框架。该模型创新性地将临床文本信息深度融入图像分割全过程,通过SwinUNETR提取视觉特征,ClinicalBERT编码病历文本,并在解码器的每个上采样阶段通过交叉注意力模块实现多级文本特征融合。实验表明,相比纯视觉模型,MMS-Former在Dice系数和IoU指标上分别提升3%以上,在处理边界模糊目标时表现尤为突出。模型还设计了结合Dice损失和图文对比损失的复合目标函数,确保分割精度与语义对齐。代码实

u012133341的博客 141

VB中产生10个不重复的随机数

前几天听了米老师的课,才知道自己真的是学得都是似懂非懂,“一桶水不满,半桶水晃荡”这个比喻是最恰当不过了。         米老师经常告诉我们说要脚踏实地地学习,那何为脚踏实地呢?我的理解是把你在哪一方面不懂的知识学会就是脚踏实地,就比如说用VB产生10个随机数,我们看着好像会了,但没有真正地去实现过;或者说我们已经实现了,但没有去总结,当真正要用到的时候,却摸不着头脑,不知如何去做。

搬砖工 3万+

一文搞懂电流、电压的有效值 RMS

交流电有正半周、负半周,直接平均可能抵消成 0,但负半周一样会发热。这个交流电如果换成直流电,能产生同样发热功率时,对应的直流电压或电流”,电容耐压通常不能按 220V 选,常见会选 400V 或更高余量。所以做硬件时,220VAC 整流滤波后电容上会接近。电压/电流的有效值,也叫。如果它加在电阻上,发热按。

qq_52293640的博客 450

C++产生一定范围内不重复的随机数

使用random_shuffle洗牌函数产生随机序列(两种形式) 方法一: vector<int> random_permut_1(int n) { vector<int> temp; for (int i = 0; i < n; i++) temp.push_back(i); std::random_shuffle(tem...

loveC__的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

如何产生不重复的随机数

package 如何产生不重复的随机数; import java.util.Random; public class Rand { public static void main(String[] args) { //产生随机数的类 Random random = new Random(); // 装随机数的数组 10个整数 int[] num = new int[10];

面包侠的博客 3328

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

产生不重复随机数

最近想做一个小游戏,其中用到产生不重复随机数!~~~自己写了

boboidea 634

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

关于产生不重复随机数的算法 C#

我们不得不承认这样一个事实:那就是尽管在高级程序语言设计中包含了类似于Random产生随机数之类的方法,但是它产生的随机数并不能满足我们日常所有需要,因为它可能重复——设想一下,电子化抽取试题的原理就是根据预定产生的题目数量产生果敢若干个对应的随机数,然后将匹配的试题抽取、排序并打印在试卷上。但是在同一次考试时候不允许同一题目出现重复(尽管这样的概率很低,但是我们绝对不允许这样做!)。所以避免产生

iceberg的专栏 1676

产生不重复随机数的方法

      我在青鸟学习的时候,遇到过这样的问题。老师给的方法感觉有点不太好。产生的数是从大到小排列的,感觉不太舒服。在网上也搜过一些。也没有得到满意答案(可能因为自己没有看懂,或方法不对吧)。      经过自己的努力,终于有了答案,拿出来和大家分享。各位老大,哪里有不足和更好的方法请指教。(在vs2005环境,C#语言中实现的) public partial class

十狐狸的专栏 657

WPF产生不重复的随机数

WPF产生不重复的随机数 在给定的区间范围(比如[50,99]),产生给定数量的随机数(不如10个),要求产生的随机数不重复首先给定变量min=50;max=99+1;//习惯与程序规定的编码不同所致n=10;好了,上代码1.xaml界面格式 <Grid> <TextBlock x:Name="tb_Screen" HorizontalAlignment...

weixin_33980459的博客 322

5位随机数重复的概率 php_PHP产生不重复随机数的5个方法总结

无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地。在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下方法一:$numbers = range (1,50);//shuffle 将数组顺序随即打乱shuffle ($numbers);//array_slice 取该数组中的某一段$num=6;$result = ...

weixin_39883256的博客 145

随机不重复排序算法及Java产生随机数的3种方式

问题描述        给定任意个不重复的数字,对其进行随机排序 算法分析        首先想到可以将给定的数字放在一个集合A中,初步定为一个ArrayList,这样,可以用A集合的长度来做为随机数的基数,取出一个数x,放到结果集合B中,然后将数x从A集合删除;接着用A集合剩下的长度作为基础重复上一步操作,最终可以得到结果集合B。考虑到用Arraylist删除比较慢,可以用Link

单向街的夏天 5323

如何让C#产生不重复的随机数

<br />在.net Framework中提供了一个专门用来产生随机数的类System.Random。<br /><br /> <br /> <br /> <br /><br />  但是用Random类生成id号,会出现重复,特别是在数量较小的范围内中要生成不重复的是很难的,参考了网上的一些方法,包括两类,一类是通过随机种子入手,使每一次的随机种子不同,来保证不重复;第二类是使用一些数据结构和算法。下面主要就第二类介绍几个方法。<br /><br />方法1:思想是用一个数组来保存索引号,先随机生成一个

AmyXu 2896

c51随机数不重复_C 语言产生随机数的方法

在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int...

weixin_42108054的博客 1031
上一篇: 数论的欧拉定理证明 &amp;amp; 欧拉函数公式
下一篇: TopCoder SRM 360 DIV2 500 分题目, 需要排列组合么?需要强力法么?
Rappy
博客等级 码龄20年 48粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值