乱序算法(shuffling algorithm)

算法练习01 数组乱序 使用sort方法?借助 sort 方法不是真正意义上的完全乱序var letters = ['A','B','C','D','E','F','G','H','I','J'];比如 A 元素大概率出现在数组的头部,J 元素大概率出现在数组的尾部,所有元素大概率停留在自己初始位置原因是:在Chrome v8引擎源码中,处理 sort 方法时,使用了插入排序和快排两种方案。当目标数组长度小于10时,使用插 阅读详情

问题

shuffling 就是希望打乱一个基本有序的序列,越乱越好

比如现在有一个已经排好序的 objects,以下面扑克牌为例:

在这里插入图片描述
我们希望能够随机的打乱它的顺序,比如得到下面的序列:

在这里插入图片描述


基于排序的shuffling

我们可以为每一个数组中的元素随机的产生一个随机数,然后对随机数进行排序,排序的同时移动相应的数组中的元素,排序完成后,即可以实现数组中的元素乱序:

在这里插入图片描述
在这里插入图片描述


基于交换的shuffling(Knuth shuffle)

Knuth shuffle 的思想是这样的:

  • 依次遍历数组当中的每个元素,在遍历第 i 个元素的时候,在 [0, i] 之间产生一个随机数 r (也可以在 [i, n-1] 之间产生随机数,但一个常见的错误是在 [0, n-1] 之间产生)
  • 交换 a[i] 和 a[r]
LLM and Embedding区别 LLM(大语言模型)和 Embedding(嵌入)是自然语言处理(NLP)中的两个核心概念,它们的核心区别在于。Embedding 计算向量。 阅读详情

相关推荐

【信息科学与工程学】【安全领域】第三十五篇 网络安全算法

编号算法名称算法的逐步骤思考推理的数学方程式和分解的数学方程式参数/变量列表复杂度(时间/空间)1​AES (高级加密标准)​1. 密钥扩展:从初始密钥生成轮密钥。 2. 初始轮: 3. 主轮循环(Nr-1轮):  - SubBytes:(非线性字节替换)  - ShiftRows:对状态矩阵的行进行循环移位。  - MixColumns:(在GF(2⁸)上的矩阵乘法)  - AddRoundKey: 4. 最终轮:执行SubBytes、ShiftRows、AddR

weixin_49199313的博客 1287

JavaScript的乱序算法【可视化比较】

1.sort()方法 之前被问问题的时候,问到如何讲一个数组打乱,当时也不由思索说出了一个比较常用的方式,也可以说是我目前接触到最精简的方式: function randomsort(a, b) { return Math.random()>0.5 ? -1 : 1; } 这里介绍下sort()函数,在JS中Array对象里内置了一个函数: array.sort(sortfunction) 此方法将 Array 对象进行适当的排序;在执行过程中并不会创建新的 Array 对象。 如果调用

qq_41841048的博客 569

【QT开发】web开发,内嵌网页展示和交互工具QWebEngineView类详解及实战应用

QWebEngineView 类为 Qt 应用提供了强大的网页展示和交互能力。通过合理运用其方法、属性和事件,能够创建出功能丰富、用户体验良好的网页浏览界面。在开发过程中,要注意处理常见问题,以确保网页的正常展示和交互效果。

科技改变人类,技术成就未来 1980

简单的乱序算法

简单的乱许算法,思想是从n到1迭代,每次迭代随机从0到n-1中抽一个数与当前数字交换,最后得到的序列就是乱序的。该算法可以用于洗牌等地方。函数和测试程序如下: #include #include #include #define MAX 52#define swap(a, b) (a) ^= (b);(b) ^= (a);(a) ^= (b);int* shuffl

雨婷的专栏 6345

乱序算法排列数组

从最大下标开始,生成的随机数要小于当前下标,且不等于当前下标。(从大到小,为了更好地控制随机下标的生成)通过成成随机数,将当前下标与随机下标交换,达到打乱的目的。将一个有序数组打乱为无序数组。

cfz1095858425的博客 673

java 乱序算法_前端面试(算法) - 数组乱序

一、面试题问:有一个长度为 100 的数组,如何从中随机挑选 50 个元素,组成一个新的数组?答:这个...那个...emmmmmm问:那先不挑 50 个,就挑一个数,知道怎么做吗?答:这个我知道!随机生成一个 0 ~ 99 的数,然后去原数组取对应位置的元素就可以了~let randomIndex = arr[Math.floor(Math.random() * arr.length)];问:好...

weixin_39646706的博客 337

java 乱序算法_Java排序算法

Java排序算法1)分类:1)插入排序(直接插入排序、希尔排序)2)交换排序(冒泡排序、快速排序)3)选择排序(直接选择排序、堆排序)4)归并排序5)分配排序(箱排序、基数排序)所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序不稳定:快速排序,希尔排序,堆排序。1)选择排序算法的时候1.数据的规模 ;2.数据的类型 ;3.数据已有的顺序一般来说,当数据规模较小时,应...

weixin_42133452的博客 856

了解Java代码实现排序算法

1Java 代码实现排序算法 1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中。 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列。 对第四个数、第五个数……直到最后一个数,重复第二步。 如何写写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入。 设定插入数和得到已经排好序列的最后一个数的位数。insertNu.

dongbeiou的专栏 307

乱序算法及C++函数

 我们经常看到排序的算法,但有的时候,也需要将某个有序的序列打乱顺序,就叫“乱序”吧。按排序的定义,“乱序”应该是这样的:将一组记录(或者元素,本身可以是有序或者无序的)按照某个域的值(称之为“排序码”)的随机次序重新排列的过程。 这里我们注意到无论是排序还是乱序,都是按某个域的值进行的。比如我们将一组数据存放在某个数组中,需要进行乱序,则只需要将数据下标(1-N)进行乱序后,再依次输出数组的内容

xmxoxo的专栏 4492

数组乱序的三种实现方式

文章目录前言一、for循环1.代码块2、结果二.Frisher-Yates算法1.代码块2.结果三.利用Collections工具类1.代码块2.结果总结 前言 将数组中的数据以随机分为两组且两组数据中不可有重复值。例如:String[]role = {“安琪拉”,“白起”,“妲己”,“狄仁杰”,“典韦”,“韩信”,“老夫子”,“刘禅”,“鲁班七号”,“墨子”,“孙膑”,“孙尚香”,“孙悟空”,“项羽”,“亚瑟”,“周瑜”,“庄周”,“蔡文姬”}; 分为group1[]、group2[]这两个数组。 一

qq_55135629的博客 3772

数组乱序(打乱数组,至少两种方法)js

数组随机排序(shuffle) 方法1:时间复杂度 O(n^2) // 方法2:随机抽取法, 时间复杂度 O(n^2) function randomSortArray(arr) { let backArr = []; while (arr.length) { //Math.random():返回 [0,1) 之间的一个随机数 let index = parseInt(Math.random() * arr.length); // 利用数组长度生成随机

SpringRolls的博客 1万+

乱序算法: 将整数集合中的元素按一定规则打乱排序,N个相等的数之后从后方不同的数中插入该位置

最近在工作中遇到个打乱算法,需求是一个对象集合,经过一定规则排序后,需要将相同类型的n个元素中插入一个不同类型的元素(从后方元素中查找),网上也没搜索到相应的算法,所以经过一个晚上的思考,最终将此算法安排了。 这里我将该算法分享出来,如果有性能更好的算法,也请大伙一起做个分享,也顺带当做笔记记录下来。 这里我已整数集合为例子: import java.util.ArrayList; imp...

崋崽的博客 1989

中高级前端必须了解的--数组乱序

引言 数组乱序指的是:将数组元素的排列顺序随机打乱。 将一个数组进行乱序处理,是一个非常简单但是非常常用的需求。 比如,“猜你喜欢”、“点击换一批”、“中奖方案”等等,都可能应用到这样的处理。 sort 结合 Math.random 微软曾在browserchoice.eu上做过一个关于不同浏览器使用情况的调查,微软会在页面中以随机顺序向用户显示不同的浏览器。 然而每个浏览器出现的位置并不是随机...

weixin_34348805的博客 722

洗牌算法

我知道大家会各种花式排序,但是如果叫你打乱一个数组,你是否能做到胸有成竹?即便你拍脑袋想出一个算法,怎么证明你的算法就是正确的呢?乱序算法不像排序算法,结果唯一可以很容易检验,因为「乱」可以有很多种,你怎么能证明你的算法是「真的乱」呢? 所以我们面临两个问题: 1. 什么叫做「真的乱」? 2. 设计怎样的算法来打乱数组才能做到「真的乱」? 这种算法称为「随机乱置算法」或者「洗牌算法」。 ...

ahyangHaifeng的博客 583

C++ C# JS 数组乱序算法

一、背景 数组乱序指的将数组的每一个元素随机打乱,并且对于每一个元素而言,它被放置到每一个位置的概率都相等。 有很多算法都能实现这个要求,其中Knuth-Durstenfeld Shuffle算法性能较高,其时间复杂度为O(n),空间复杂度为O(1),实现也简单一些,这里给出算法的原理以及C++程序和C#程序。 二、Knuth-Durstenfeld Shuffle算法算法原理具体如下: 已...

zzq61974的专栏 583

集合乱序方法

这是转的,在别的地方看到的,记录下来~   排序的算法有很多,也有很多公认的方法,冒泡、插排、快排。乱序算法一直没有什么公认的好方法。自己尝试做了一些,觉得这个方法还比较不错,在这里把东西备份一下,以免以后忘记了,找不到了。如果有朋友有更好的算法,请您赐教。   假设现在有一个集合,里面有10个元素,需要做乱序。   我的做法是,每次随机产生一个集合索引范围内的随机数,从集合中...

smallblood的专栏 370

乱序数组的算法

在做开发的时候,遇到了一个问题

ProgramChangesWorld的专栏 1275

将一数组乱序排列的三种方法

游戏中遇到这样的问题,需要将一组已知的数据打乱,按照以前和现在的做法,总结了以下方法。 方法一,最笨的菜鸟方法,也是容易想到的(幸好我没想过这种方法 :)) 从已知数组中随机一个数,然后加入到另一个数组中,在加入之前,先检查是否已经加入过。 这种方法有很大运气成分,且数据越大,效率越低,超过一定数目,则程序几乎无法执行,会一直卡在那里,代码: package com.test; im

zzqkillyou的专栏 2万+

C++ STL 乱序算法

本次要注意:time.h与ctime本质一样,ctime是c++风格(标准),time.h是c语言风格。同理:如stdio.h和cstdio代码如下:#define _SCL_SECURE_NO_WARNINGS #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;functional&gt; #include &lt...

IT1995的博客 6174

打乱(shuffling)

前言 前面已经学习了好多排序的算法,那怎样才能将一个排列好的数组打乱呢?(感觉自己好作啊,先排序,再打乱,在排序。。。) 下面就来学习一下打乱算法和其c++代码: 打乱算法 打乱算法有许多种,举个例子,这里有排列好的1到10的扑克牌,我们将其反过来,在每一张的背面随机写上1到10之间的数,然后再对背面的数进行排序,排好之后再翻回正面,相信已经打的很乱了。但这样需要排序,耗费时间又耗费内存,...

qq_39747794的博客 656

linux-AndroidKitchen一个基于文本的kitchen用于定制AndroidROM

Android-Kitchen一个基于文本的kitchen用于定制Android ROM。使用shell脚本并支持Cygwin/OS X/Linux。

上一篇: 并查集
下一篇: 凸包算法(Convex Hull Algorithm)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值