在Bash上获取生成数字的模式

时间:2018-04-28 19:12:31

标签: bash

我需要帮助在bash中获取随机生成数字的模式。我不知道从哪里开始,有什么帮助吗?

即[1,2,3,3,4]模式为3。

谢谢。

2 个答案:

答案 0 :(得分:1)

这样可行(通过用于生成数字的任何方法替换第一个管道之前的位)

echo 1 2 3 3 4 | xargs printf "%s\n" | sort | uniq --count | sort | tail -n1 | awk '{ print $2 }'

如果您想知道它的工作原理,请尝试一次添加一个阶段。

echo 1 2 3 3 4 | xargs printf "%s\n"
echo 1 2 3 3 4 | xargs printf "%s\n" | sort
echo 1 2 3 3 4 | xargs printf "%s\n" | sort | uniq --count
....

如果有平局,你只会得到两个答案中的一个(我猜的更高),如果其中一个有超过9个,你也可能得到错误答案,但这是一个开始。

答案 1 :(得分:0)

你实际上可以使用一个简短的bash函数来执行它,该函数将stdin读入一个索引数组,用于将数字传递给sort,然后一个循环将填充一个频率数组 arr,其中包含每个数字的出现频率,同时跟踪最大出现次数。然后它只输出读取数字集的模式,例如

#!/bin/bash

getmode () {
    mapfile input   ## stdin into array
    local -a arr    ## declare frequency array
    ## pipe sorted array to loop to capture frequency of each number
    printf "%s\n" ${input[@]} | sort -n |
    {
        mode=
        max=0
        while read -r n; do
            arr[$n]=$((${arr[n]}+1))        ## increment index at number
            ## check if arr[n] is most frequent
            [ "${arr[n]}" -gt "$max" ] &&
            {
                max="${arr[n]}"
                mode=$n
            }
        done
        echo "mode $mode"       ## output the mode
    }
}

echo $@ | getmode

注意:如果有两个(或更多)值具有相等的最大值,则需要确定如何处理模式 - 目前它将采用多个相等最大值中的第一个)< / p>

示例使用/输出

$ bash findmode.sh 1 2 3 3 4
mode 3

或更长的未排序集:

$ bash findmode.sh 1 8 3 1 5 2 7 5 3 9 5 1 6 5
mode 5