前言
在群里聊天谈到随机不重复的问题,想到了今天这篇文章的思路:
生成随机不重复的序列有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
运行结果:
=正文完=
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved