簡體   English   中英

如何在3行中生成隨機數-Linux Shell腳本

[英]How do I generate random numbers in 3 lines - Linux Shell Script

我想編寫一個代碼,該代碼可以生成3行,每行6個隨機數,間隔6個隨機數,在給定時間(0.5秒)后會隨機播放,並且不會創建新行,基本上6個隨機數會在3行中繼續生成。 到目前為止,我的代碼是:

echo " "

echo " "

echo " "



for i in {1..5};

do

for i in {1..1};

do


echo -ne " $(($RANDOM % 100))   $(($RANDOM % 100))   $(($RANDOM % 100))   $(($RANDOM % 100))   $(($RANDOM % 100))   $(($RANDOM % 100))\r"


done

sleep 0.5

done

但是,當我嘗試將第二行和第三行添加到此行時,它似乎無法按照我想要的方式工作。 輸出示例如下:

45 88 85 90 44 22

90 56 34 55 32 45

58 99 42 10 48 98

在這些數字之間,將生成新的數字,僅保留6列和3行。 我也嘗試過制作矩陣,但是對我來說不起作用。

我建議您避免為此使用外殼程序。 Shell非常適合於自動執行系統管理任務-例如與文件,目錄,Shell命令進行交互-但也可以使人們遠離學習“真正的”和最強大的編程語言。

python,ruby或perl可以幫助您。

如果您只有錘子,那么一切看起來都像釘子。

例如紅寶石

def print_random_numbers(num)
  random_numbers = []
  num.times do |n|
    random_numbers << rand(100)
  end
  puts random_numbers.join(' ')
  puts
end


while true
  3.times do
    print_random_numbers(6)
  end
  sleep 0.5
end

我不確定我是否真的了解您的問題,但是:

這使您從1-100的范圍內隨機抽取6個數字

numbers=$(shuf -i 1-100 -n 6)
echo $numbers

選擇的數字沒有重復。 如果要重復,請使用-r。

這使您可以對之前繪制的數字進行排列:

 echo $numbers | tr ' ' '\n' | shuf | xargs echo

我不知道您是否已完成,但是從注釋繼續,我將使用1-100之間的隨機值填充索引數組,例如

#!/bin/bash

for ((i = 0; i < 18; i++)); do      ## fill array with random values
    a[i]=$(($RANDOM % 100 + 1))
done

然后,您想要的是一個可以調用的函數,在每行中傳遞值的數量(以便您可以在打印完這些數字后輸出'\\n' ),然后將數組值作為該函數的參數讀入本地函數內的數組(當然,您可以使用原始數組而不必擔心將元素作為參數傳遞,但是我更喜歡在函數內使用local值來保持其他范圍內的值不變。為此,您的打印函數可能類似於:

## function to print array in shuffled order, using tput for cursor control
prnarray() {
    local n=$1
    local al=( ${@:2} )
    local c=0
    for i in $(shuf -i 0-$((${#al[@]} - 1))); do
        [ "$c" -gt '0' -a $((c % n)) -eq '0' ] && printf "\n"
        printf " %3d" "${al[i]}"
        ((c++))
    done
    printf "\n"
    tput cuu 6   ## tput is used for cursor control to move back to top
}

然后,您實際上不需要太多其他步驟就可以循環打印陣列, sleep一段時間,然后再次調用prnarray來用新的shuffle覆蓋輸出。 例如

tput sc     ## save cursor position

## call prnarray 3 times with 5 sec. delay between displays
declare -i c=0
while (( c < 3 )); do
    prnarray 3 ${a[@]}
    ((c++))
    sleep 5
done

tput rc     ## restore cursor position

使用/輸出示例

陣列將每5秒鍾在相同的位置打印一次,其中相同的元素將隨機排列到陣列中的不同位置。

$ sh randomshuf.sh
  33  30  34
  86  98  48
  94  89  80
  50  57  34
  11  45  57
  80  42  22

試一試,如果您有任何疑問,請告訴我。

注意:使其3x6更改行:

 tput cuu 3

prnarray 6 ${a[@]}

更改這些內容后,您的輸出將類似於:

$ sh randomshuf.sh
  85   9  45  14  18  16
   6  59  43  19  29  58
   7  89  18  72  29  29

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM