shell - 在 shell 脚本中生成随机字符
问题描述
我现有的脚本可以产生 "blue,blue,red,red"
但不希望重复任何颜色。
#!/bin/sh
c1="white"
c2='yellow'
c3='orange'
c4='red'
c5='green'
c6='blue'
array=( "$c1" "$c2" "$c3" "$c4" "$c5" "$c6" )
rand0=$RANDOM
rand0=$[ $rand0 % 6 ]
rand1=$RANDOM
rand1=$[ $rand1 % 6 ]
rand2=$RANDOM
rand2=$[ $rand2 % 6 ]
rand3=$RANDOM
rand3=$[ $rand3 % 6 ]
r0=${array[$rand0]}
r1=${array[$rand1]}
r2=${array[$rand2]}
r3=${array[$rand3]}
mastermind=( "$r0" "$r1" "$r2" "$r3" )
如何过滤重复项并重新滚动以避免重复项?
解决方案
一种方法是删除已从“数组”中选择的项目,并检查新选择是否未引用已删除的项目。它试图将 OP 代码的行为概括为 - 它循环请求项目的数量 (4),并且它允许输入中的任意数量的项目array
,而无需修改代码。
#! /bin/bash
array=( white yellow orange red green blue )
mastermind=()
# Count entries in array
N=${#array[@]}
for i in {0..3} ; do
# Find R, where array[R] is valid
while R=$((RANDOM%N)) ; do [ "${array[R]}" ] && break ; done
# Add to result
mastermind+=( ${array[R]} )
# Mark item R as invalid
unset 'array[R]'
done
echo "${mastermind[@]}"
推荐阅读
- python - 在 Pandas 中获取特定年份创建的许多项目
- ios - 金属质感不可过滤
- java - 如何在 Spring Boot 控制台应用程序中验证实体?
- ios - 是什么让“蜂窝数据”切换出现在 iOS 13 的应用设置中?
- python - 散景:如何在绘图上绘制两条带有两个轴的线?
- angular - 使用 Apollo Angular 客户端时,如何对缓存查询进行单元测试?
- javascript - 在反应中渲染二维数组的最佳方法?
- matlab - Matlab中逐行保存文本文件中数组数据的解决方法
- audio - 声音使应用程序在 Android 上滞后 - 有什么解决方案吗?
- android - 带有 Material Component 主题的 colorAccent 或 colorSecondary