Bash从数字池中生成随机数

时间:2016-09-21 14:29:12

标签: bash

我想从给定列表中生成一个随机数

例如,如果我给出数字

1,22,33,400,400,23,12,53 etc.

我想从给定的数字中选择一个随机数。

1 个答案:

答案 0 :(得分:1)

无法找到与此完全相同的内容。所以这是我的尝试,正是123在评论中提到的。该解决方案可跨shell变体移植,并且不使用任何shell二进制文件来简化性能。

您可以直接在控制台上运行以下命令。

# Read the elements into bash array, with IFS being the de-limiter for input
IFS="," read -ra randomNos <<< "1,22,33,400,400,23,12,53"

# Print the random numbers using the '$RANDOM' variable built-in modulo with 
# array length.
printf "%s\n" "${randomNos[ $RANDOM % ${#randomNos[@]}]}"

根据下面的评论,如果你想忽略一个范围内的某个数字列表来选择;采取如下方法

#!/bin/bash

# Initilzing the ignore list with the numbers you have mentioned
declare -A ignoreList='([21]="1" [25]="1" [53]="1" [80]="1" [143]="1" [587]="1" [990]="1" [993]="1")'

# Generating the random number
randomNumber="$(($RANDOM % 1023))"

# Printing the number if it is not in the ignore list
[[ ! -n "${ignoreList["$randomNumber"]}" ]] && printf "%s\n" "$randomNumber"

您可以将其保存在bash变量中,例如

randomPortNumber=$([[ ! -n "${ignoreList["$randomNumber"]}" ]] && printf "%s\n" "$randomNumber")

记住关联数组需要bash版本≥4才能工作。