根据Powershell中的百分比随机更改2D数组

时间:2018-10-23 12:37:22

标签: powershell percentage

我试图根据Powershell中的可变百分比随机更改数组。 不幸的是我没有得到预期的输出。 在下面的脚本中,我尝试根据随机生成的输出更改数组的20%。

有人知道做到这一点的最佳方法吗?

    $row = 4
    $col = 2

    $temp_array = New-Object 'object[,]' $row,$col
    for ($i=0;$i -le $row -1 ; $i++) {
        for ($j=0;$j -le $col -1 ; $j++) {
            $temp_array[$i,$j] = Get-Random -Minimum 1 -Maximum 10 
        }
    }


    $perc_to_change = 0.2


    for ($i=0;$i -le $row -1 ; $i++) {
        for ($j=0;$j -le $col -1 ; $j++) {
            $check_digit = Get-Random -Maximum 1 -Minimum 0.0
            If($check_digit -lt $perc_to_change){
                $temp_array[$i,$j] = "changed"
            }
            Write-Host "temp array [" $i "][" $j "] = " $temp_array[$i,$j]
        }
    }

2 个答案:

答案 0 :(得分:0)

IMO,您需要一种不同的方法来获得随机百分比分布在行和列上。

唯一编号的行和列

      C0 C1 C2 C3 C4
R0    0  1  2  3  4
R1    5  6  7  8  9
R2    10 11 12 13 14
R3    15 16 17 18 19
R4    20 21 22 23 24

此脚本使用Get-Random -Count从$ rows与$ cols的乘积中选择百分比,迭代结果并重新计算行和列。

## Q:\Test\2018\10\23\SO_52949282.ps1
$row = 5
$col = 5

$temp_array = New-Object 'object[,]' $row,$col
for ($i=0;$i -le $row -1 ; $i++) {
    for ($j=0;$j -le $col -1 ; $j++) {
        $temp_array[$i,$j] = Get-Random -Minimum 1 -Maximum 10
    }
}

$elements = $row * $col
$Count    = [Math]::Floor($elements * 0.2)

0..$($elements-1) | Get-Random -Count $count | ForEach-Object {
    "{0,2} = [{1},{2}]" -f $_,[Math]::Floor($_/$col),($_ % $col )
}

如何处理所产生的百分比,我会留给您。

样本输出(5 * 5的20%为5):

 6 = [1,1]
11 = [2,1]
16 = [3,1]
 9 = [1,4]
19 = [3,4]

答案 1 :(得分:0)

为了更好地匹配您的exactly 20%请求,请看一下...

$TargetPct = 20
$ValueRange = @(20, 40, 60, 80, 100)

$Results = 1..100 |
    ForEach-Object {
        Get-Random -InputObject $ValueRange
        }

($Results -eq $TargetPct).Count

上面显示的计数始终接近100的理想20%。我运行了几次代码,“精确20”的计数范围为17到23。

使用-InputObject参数绕过-Max参数为您提供的“相差一”。

  • -Min 10 -Max 20 >>> 10..19
  • -InputObject (10..20) >>> 10..20