Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我正在尝试编写一个bash脚本,其中显示10个不同的随机数,到目前为止,我得到的一些数字是重复的_Bash_Shell - Fatal编程技术网

我正在尝试编写一个bash脚本,其中显示10个不同的随机数,到目前为止,我得到的一些数字是重复的

我正在尝试编写一个bash脚本,其中显示10个不同的随机数,到目前为止,我得到的一些数字是重复的,bash,shell,Bash,Shell,我认为条件和数组有问题。 这是我的剧本 谢谢你抽出时间,我很感激 #!/bin/bash loop=10 range=20 count=1 declare -a prev numb=$[1+RANDOM% $range] prev+=($numb) echo =========================== echo $loop DIFFERENT RANDOM NUMBERS echo =========================== echo $numb until [

我认为条件和数组有问题。 这是我的剧本 谢谢你抽出时间,我很感激

#!/bin/bash

loop=10
range=20
count=1
declare -a prev
numb=$[1+RANDOM% $range]
prev+=($numb)

echo ===========================
echo $loop DIFFERENT RANDOM NUMBERS
echo ===========================

echo $numb

until [ "$count" -ge "$loop" ]
do
    numb=$[1+RANDOM% $range]

    if [[ ${prev[@]} -ne $numb ]] ; then
        echo $numb
        prev+=$numb
        ((count++))
    fi
done

代码尝试使用条件
[[${prev[@]}-ne$numb]]
查找以前选择的数字。但是,bash没有处理数组和值的“in”(或“notin”)操作符

考虑改用bash关联数组。通过在与所选编号关联的位置中输入值来标记每个使用的元素

#! /bin/bash

loop=10
range=20
  # Associative array prev[N]=1, if N was already printed
declare -A prev

echo ===========================
echo $loop DIFFERENT RANDOM NUMBERS
echo ===========================


for ((count=1 ; count <= loop ; count++)) ; do
    numb=$[1+RANDOM% $range]
    while [ "${prev[$numb]}" ] ; do
        numb=$[1+RANDOM% $range]
    done ;
    echo $numb
    prev[$numb]=1
done
#/bin/bash
循环=10
范围=20
#关联数组prev[N]=1,如果已打印N
声明-上一个
回音===========================
echo$loop不同的随机数
回音===========================

对于((count=1;count代码尝试通过使用条件
[[${prev[@]}-ne$numb]]]
来定位以前选择的数字。但是,bash没有处理数组和值的“in”(或“not in”)运算符

考虑改用bash关联数组。通过在与所选数字关联的位置输入一个值来标记每个使用的元素

#! /bin/bash

loop=10
range=20
  # Associative array prev[N]=1, if N was already printed
declare -A prev

echo ===========================
echo $loop DIFFERENT RANDOM NUMBERS
echo ===========================


for ((count=1 ; count <= loop ; count++)) ; do
    numb=$[1+RANDOM% $range]
    while [ "${prev[$numb]}" ] ; do
        numb=$[1+RANDOM% $range]
    done ;
    echo $numb
    prev[$numb]=1
done
!/bin/bash
循环=10
范围=20
#关联数组prev[N]=1,如果已打印N
声明-上一个
回音===========================
echo$loop不同的随机数
回音===========================

对于((count=1;count使用数组的快速版本-

$: loop=10 min=20 range=20 all=( $( seq $min $((min+range)) ) )
$: while (( loop-- ))
   do ndx=$((RANDOM%range))
      if (( all[ndx] ))
      then echo "${all[ndx]}"
           unset "all[ndx]"
      else let loop++
      fi
   done
33
38
27
23
39
32
22
20
36
35
将每个元素取消设置为使用状态可防止重复。

我很确定有更好的方法…还在思考。

使用数组的快速版本-

$: loop=10 min=20 range=20 all=( $( seq $min $((min+range)) ) )
$: while (( loop-- ))
   do ndx=$((RANDOM%range))
      if (( all[ndx] ))
      then echo "${all[ndx]}"
           unset "all[ndx]"
      else let loop++
      fi
   done
33
38
27
23
39
32
22
20
36
35
将每个元素取消设置为使用状态可防止重复。

我很确定有更好的方法…仍在思考。

指出,数组只需在
[…]中
,您应该使用循环而不是循环,这是因为从同一发行版中抽取的10个随机数应该会产生重复数。要求给定的数字不能与以前生成的数字匹配,意味着您需要使用不同的发行版来生成该数字。使用shell调试跟踪集运行代码,添加
集-vx
在脚本的顶部。你的
[[${prev[@]}-ne$numb]]
没有按照你认为的方式工作。祝你好运。这可能会带来麻烦:
seq 10 | shuf
@Cyrus,这里的需求似乎表明
seq 20 | shuf | head-n 10
指出数组只会出现在
[…]
,您应该使用循环而不是循环,这是因为从同一发行版中抽取的10个随机数应该会产生重复数。要求给定的数字不能与以前生成的数字匹配,意味着您需要使用不同的发行版来生成该数字。使用shell调试跟踪集运行代码,添加
集-vx
在脚本的顶部。您的
[${prev[@]}-ne$numb]]
没有按你想象的方式工作。祝你好运。这可能会带来麻烦:
seq 10 | shuf
@Cyrus,这里的需求似乎表明
seq 20 | shuf | head-n 10
谢谢你,我现在看到了数组类型的不同。还有简单循环。它看起来更可读。谢谢你,我现在看到了数组类型的不同。简单循环。它看起来更可读。cheers“接受解决方案”表示单击将其标记为接受解决方案的复选标记。c.f.和。“接受解决方案”表示单击将其标记为接受解决方案的复选标记。c.f.和。