算法:随机从集合中获取元素集  


本来初衷是想写一个洗牌算法。思路如下:

第一趟:对于一个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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

电子邮件地址不会被公开。 必填项已用*标注