我有一个简单的 bash 脚本,可以生成以下内容:
These are your winning lottery numbers:
27 6 29 17 15 47
19 16 33 15 20 14
29 34 48 19 33 40
这是它的代码:
#!/bin/bash
tickets="$1"
function get_tickets { printf "How many tickets are you going to get? "; read tickets;}
function gen_numbers { printf "\nThese are your winning lottery numbers: \n";
for ((z=1 ; z<=tickets ; z++)); do
for ((i=0; i<6; i++ )); do
x=`echo $[ 1 + $[ RANDOM % 49 ]]`;
printf "\t $x";
done;
printf "\n"
done;
printf "\n"; }
############################
if [[ -z $tickets ]] ; then
get_tickets
gen_numbers
else
gen_numbers
fi
我的问题是,有谁知道如何修改它以防止每行出现重复的数字? 我想我会使用 uniq 和一个数组,但我不确定它会是什么样子。 任何意见,将不胜感激;谢谢!
你的尝试非常好。但是,我认为使用
shuf
命令来获取随机值可以更容易、更安全:
$ shuf -i 1-49 -n18 | xargs -n6
39 42 43 7 14 23
10 27 5 13 49 8
31 36 19 47 28 4
shuf -i X-Y -nZ
给出 X 和 Y 之间的 Z 个随机数。然后 xargs -nT
将它们格式化为每行 T 个数字组。
现在看到评论:
是的;以避免一行中出现重复的数字(按票)。
在这种情况下,您只需执行
shuf -i 1-49 -n6
即可获得 6 个随机数。输出以行分隔,因此您可以使用 tr '\n' ' '
使其以空格分隔。
如果您想要很多行,例如 5 行,您可以这样做:
for i in {1..5}; do shuf -i 1-49 -n6; done | xargs -n6
输出示例:
$ for i in {1..5}; do shuf -i 1-49 -n6; done | xargs -n6
4 45 12 42 37 46
42 20 29 22 12 5
40 41 14 28 4 2
35 24 16 22 2 39
14 46 47 20 21 41
为了避免按行重复,请使用数组来标记使用的值。这是脚本的修改版本:
for ((z = 1; z<=tickets ; z++)); do
i=0
used=( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 )
for (( ; i<6; )); do
x=`echo $[ 1 + $[ RANDOM % 49 ]]`;
if [ ${used[$x]} -eq 0 ]
then
printf "\t $x";
i=$((i + 1))
used[$x]=1
fi
done;
printf "\n"
done;
printf "\n"; }
编辑:解释。
想法很简单,我们用数组来标记那些已经使用过的值。
最初数组的所有元素(对应于值 [0, 49] 的 50 个元素)都设置为零,即所有数字都可用。
对于每个随机数x,我们检查该数字是否可用(used[x] = 0),如果是,我们增加计数器i并标记该值(used[x] = 1)以避免重复。
如果该值已被使用,只需一次又一次尝试,直到找到未使用的值。
检查这个,这是仅使用 JavaScript 实现乐透数字生成器的一个很好的示例:https://lotto6aus49online.de/#zaufallszahlen;您可以通过自己单击每个数字来停止生成器,这会为算法添加额外的随机性。希望你喜欢它!
我不知道这个话题是否是相对的,但我使用了这里的数字,得到了 6、15、17、27 的正确结果,得到了 60 美元!希望有更多的数字