2016-09-21 2 views
0

Я хочу, чтобы сгенерировать случайное число из заданного спискаBash генерация случайных чисел из пула номеров

Например, если я дам числу

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

Я хочу, чтобы выбрать случайное число из заданных чисел ,

+2

Поместите их в массив, rand mod размером с массив. – 123

ответ

1

Не удалось найти точный дубликат этого. Итак, вот моя попытка, именно то, что 123 упоминает в комментариях. Решение переносится по вариантам оболочки и не использует никакие двоичные файлы 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") 

Помните ассоциативные-массивы нужно Баш версии ≥4 работать.

+2

Я не думаю, что массивы переносятся через оболочки. –

+1

Почему вы используете чтение вместо обычного массива? – 123

+1

@ 123: Да, я мог бы это сделать, хотел продемонстрировать, как точный ввод с запятой может быть превращен в такой результат. – Inian

Смежные вопросы