如何在3行中生成随机数 - Linux Shell Script

时间:2017-04-18 03:03:56

标签: linux bash shell random

我想编写一个代码,可以生成3行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行。我也试过制作矩阵,但它对我不起作用。

3 个答案:

答案 0 :(得分:0)

我建议你不要使用shell。 shell非常适合自动执行系统管理任务 - 例如与文件,目录,shell命令交互 - 但是让人们远离学习“真实”的东西也很棒。和最强大的编程语言。

python,ruby或perl可以帮助你。

如果你拥有的只是锤子,那么一切看起来都像钉子。

例如ruby

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 :(得分:0)

我不确定我是否真的理解你的问题,但是:

这可以从1-100

范围内随机获取6个数字
numbers=$(shuf -i 1-100 -n 6)
echo $numbers

选择数字而不重复。如果您想重复,请使用-r。

这为您提供了之前绘制的数字的排列:

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

答案 2 :(得分:0)

我不知道你是否已完成,但继续评论,我会用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覆盖输出。 e.g。

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