случайным образом изменить 2D-массив на основе процента в Powershell - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь случайным образом изменить массив на основе переменного процента в 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 голосов
/ 24 октября 2018

для того, что я имел в виду под лучшим соответствием вашему запросу exactly 20%, взгляните на это ...

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

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

($Results -eq $TargetPct).Count

приведенное выше будет показывать значения, которые последовательно приближаются к идеальным 20% от 100Я запускал код несколько раз, и число «ровно 20» варьировалось от 17 до 23.

с использованием параметра -InputObject позволяет обойти «off by one», которое дает параметр -Max.

  • -Min 10 -Max 20 >>> 10..19
  • -InputObject (10..20) >>> 10..20
0 голосов
/ 23 октября 2018

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 для выбора процентаиз умножения $ строк на $ 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 )
}

Что вы будете делать с полученным процентом, я оставлю вам.

Примервыход (20% от 5 * 5 равно 5):

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