iT邦幫忙

0

PowerShell 亂數問題

  • 分享至 

  • xImage
for ($i = 0 ; $i -lt 4 ; $i++){
     
    $array[$i] = @(get-random -input 1, 2, 3, 4, 5, 6 ,7 ,8, 9 ,0)
    
    
    for ($j = 0 ; $j -lt $i ; ){
               
        if ($array[$j] -eq $array[$i]){
             $array[$i] = @(get-random -input 1, 2, 3, 4, 5, 6 ,7 ,8, 9 ,0)
            $j =0
            
            
            
            } else {
                $j++
          
           
         }         

    }
    
}



$array

目標:產生四數位不同數值的亂數。
問題:會產生出重覆數值。EX,$array 丟出來的值為[5008],其中的00為重覆值。

求各先進幫忙解惑一下,為何還是會出現重覆數值?是否能提點一下小弟該往哪個方向思考呢?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
小魚
iT邦大師 1 級 ‧ 2019-10-11 12:13:59
最佳解答

這符號真看不習慣,
不過你不需要$j++嗎?
另外,
你的第二個for迴圈外面可能要再加個while來判斷,
只不過這種不重複的問題通常會建議用撲克牌的方式來處理.
洗牌演算法
每種語言的語法會有些不同,
不過邏輯都是一樣的.

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2019-10-11 12:14:46 檢舉

換句話說,
你的需求其實就是把0~9隨機排序,
然後取前面四個數字就可以了.

narumi iT邦新手 5 級 ‧ 2019-10-11 12:19:29 檢舉

小魚大大,感謝您的回覆。迴圈中J的累進我是寫在ELSE裡。
感謝提供方向給我思考。

小魚 iT邦大師 1 級 ‧ 2019-10-11 13:12:13 檢舉

邏輯上看來是沒什麼問題,
我用我的語言跑100次也沒看到什麼重複的...

narumi iT邦新手 5 級 ‧ 2019-10-11 13:21:18 檢舉

小魚大大,你是指在下的程式碼還是洗牌演算法?

小魚 iT邦大師 1 級 ‧ 2019-10-11 13:41:43 檢舉

我是說你的語法.
洗牌演算法當然不會重複,
如果重複一定是你寫錯.
我在寫撲克牌遊戲用的就是洗牌演算法.

3
froce
iT邦大師 1 級 ‧ 2019-10-11 13:25:31
$shuffle = (0..9)

function arrayShuffle([int[]]$s){
    $count = $s.count
    $r = @()
    for ($i -eq 0; $i -lt $count; $i++){
        $_r = Get-Random -input $s
        $s = $s| Where-Object { $_ –ne $_r }
        $r = $r + [array]$_r
    }
    return $r
}

write-host((arrayShuffle $shuffle)[0..3])

甚至只想洗指定次數都可以...

$shuffle = (0..9)

function arrayShuffle([int]$t,[int[]]$s){
    if ($t -lt $s.count){
        $count = $t
    }else{
        $count = $s.count
    }
    
    
    $r = @()
    for ($i -eq 0; $i -lt $count; $i++){
        $_r = Get-Random -input $s
        $s = $s| Where-Object { $_ –ne $_r }
        $r = $r + [array]$_r
    }
    return $r
}

write-host((arrayShuffle 4 $shuffle))
write-host((arrayShuffle 9 $shuffle))
write-host((arrayShuffle 11 $shuffle))

你的寫法就重複在0到9中取隨機數4次,當然會重複,程式要想好再寫,你寫的根本就沒道理。

narumi iT邦新手 5 級 ‧ 2019-10-11 13:40:30 檢舉

感謝froce大大回覆,靜下心來看自己寫的程式碼後才發現原來亂數那裡是重覆一直在做同件事,想當然爾一定會重覆。只是當下腦袋卡住一直轉不出來。

我要發表回答

立即登入回答