本来初衷是想写一个洗牌算法。思路如下:
第一趟:对于一个N个元素的集合,生成一个0到N的随机数,把该随机数坐标对应的元素和集合中第N-1个元素交换。
第二趟:生成一个0到N-1的随机数,把该随机数坐标对应的元素和集合中的第N-2个元素交换。
依次循环N次。
时间复杂度为O(N),空间复杂度为O(1)
对算法稍作修改,即可从集合中随机返回指定个数的元素。
#
# 交换数组中的任意两个元素
#
function Swap-Elements
{
param($Array,$FromIndex,$ToIndex)
$temp = $Array[$FromIndex]
$Array[$FromIndex] = $Array[$ToIndex]
$Array[$ToIndex] = $temp
}
#
# 从集合中随机获取元素
#
function Get-RandomItems
{
param($Array,$Count=$Array.length)
if( ($Count -le 0) -or ($Count -gt $Array.length))
{
throw "Count must between 1 and $($Array.length)"
}
$rand = New-Object System.Random
for ($i = 0; $i -lt $Array.Length; $i++)
{
if($i -ge $Count){
break
}
$randomIndex = $rand.Next(0,$Array.Length-$i)
SWap -Array $Array -OldIndex $randomIndex -NewIndex ($Array.Length-$i-1)
$Array[$Array.Length-$i-1]
}
}
Get-RandomItems -Array @(1..10)本文链接: https://www.pstips.net/get-random-items.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

时间告诉我们,感情可以变淡,说过的话可以不算,爱过的人可以再换