前言

在群里聊天谈到随机不重复的问题,想到了今天这篇文章的思路:

生成随机不重复的序列有3个思路(我能想到的思路),我来逐一介绍一下:

思路一:

先弄个空的容器,可以是变量或者数组,然后去生成随机数,每生成一个随机数就往容器里面放,不过放之前要看看容器中有没有这个随机数,只要不重复就可以放进去了。

这种方法时候少量的随机数,如果需要随机大量数字就会非常费时间,甚至不能实现。

思路二:

交换法,预先准备好所有数字,这个数字是按顺序排列的,比如要生成随机序列是10个数字,那就可以是0-9或者5-14,只要是区间数字数量是10的都可以。

那0-9为例,把所有数字放入数组{0,1,2,3,4,5,6,7,8,9},接下来按顺序读取数组中的数字,每读取一个数字同时生成一个随机数,把随机数当做数组下标,取出对于序号的数组内容,两个数字交换。

举个例子,第一次去数组0,随机数是5,对于数组下标5的数字是4,那么0和4交换一下位置,新的数组就变成:{4,1,2,3,0,5,6,7,8,9},当所有数字都交换一遍,就得一个新的数组,就是随机不重复的。

思路三:

抽奖法,举个例子,假设有个箱子里面有35个球,每个球上面标注1-35的数字,我每次从箱子里面随意拿一个球,一共拿7次,注意每次拿的球都不放回去,而是放到一个新的盒子,最后得到7个不同数字的球。

这个思路就是第一次从35个数字里面选1个剩余34个,第二次从34个数字里面选1个剩余33个,以此类推,需要几个数字,就选几个。

由于每次选择的数字都被取出来了,所以之后在随机选择的时候,肯定不会选中重复的数字,保证了随机不重复。

思路一、思路二我之前都写过教程和代码,这次直接分享个思路三的。

Import "shanhai.lua" 摇奖(35,7) Function 摇奖(total,n) Dim arr={null} Dim tmp={null} For i = 1 To total arr(i-1)=i Next For i = 0 To n-1 Dim r=int((total-i)*rnd()) TracePrint "第"&i 1&"轮选出的号码:"&arr(r) tmp(i) = arr(r) arr = shanhai.Remove(arr, r) TracePrint "剩余号码:"&join(arr,",") next TracePrint "中奖号码:"&join(tmp,",") End Function

运行结果:

按键精灵投注脚本(按键精灵抽奖代码之35选7)(1)

=正文完=

,