本来初衷是想写一个洗牌算法。思路如下:
第一趟:对于一个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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
时间告诉我们,感情可以变淡,说过的话可以不算,爱过的人可以再换