论randperm函数的原理

2024-02-12 09:32
文章标签 函数 原理 randperm

本文主要是介绍论randperm函数的原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论randperm函数的原理
2007-12-25 18:05

 

关于随机数的产生,matlab提供了rand(n, m)这样的函数,其实用C++实现也是比较简单的。这里谈一下产生1~n个不重复的随机数,它到底是如何产生的?

搜一下matlab的关于randperm函数文件,果然搜到randperm.m
其解释如下:

function p = randperm(n);
%RANDPERM Random permutation.
%   RANDPERM(n) is a random permutation of the integers from 1 to n.
%   For example, RANDPERM(6) might be [2 4 5 6 1 3]
.
%   
%   Note that RANDPERM calls RAND and therefore changes RAND's state.
%
%   See also PERMUTE.

%   Copyright 1984-2002 The MathWorks, Inc.
%   $Revision: 5.10 $ $Date: 2002/04/09 00:26:14 $

[ignore,p] = sort(rand(1,n));

看到上面的解释,原来randperm又是基于rand和sort之上:即先随机产生n个数,当然这n个数可以相同,也可以相同,但并不影响排序,因为无论相等还是不相等还是可以排名的。

为了验证这个想法,当场实验一下:
>> y=rand(1, 6)

y =

    0.4103    0.8936    0.0579    0.3529    0.8132    0.0099

>> [ignore,p] = sort(y)

ignore =

    0.0099    0.0579    0.3529    0.4103    0.8132    0.8936


p =

     6     3     4     1     5     2

果然,我们看到0.009是最小,所以排序后,将它的下标,也就是它是第几个产生的(它是第6个产生的随机数,所以将它的下标6标进了第一个整型的随机数。

其次是0.0579它在原随机序列中是第3个产生的,所以排序后,将3放入第2个显示的位置。依次推,分别得到剩下的数字顺序。

果然是刁!

原来产生无重复随机数的原理是这样的:任何随机数,其产生的顺序必然是一整数序列:
即从1, 2, 3, ..., n产生了n个数,你且别管这n个数是不是重复的,反正是产生了n个数,这n个数都有自己对应的一个下标,这个下标就是它是第几个产生的。即一个随机数有两个特征:

1. 它的大小。
2. 它的下标,即它是第几个产生的。

无论有多少个重复的数,其总有一个排序结果,这个排序的结果所对应的数的下标即随机产生的数列。

当然在排序的过程中其下标要跟着置换变化。

这篇关于论randperm函数的原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702274

相关文章

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

Kotlin运算符重载函数及作用场景

《Kotlin运算符重载函数及作用场景》在Kotlin里,运算符重载函数允许为自定义类型重新定义现有的运算符(如+-…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算... 目录基本语法作用场景类对象数据类型接口注意事项在 Kotlin 里,运算符重载函数允许为自定义类型重

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl