gpt4 book ai didi

arrays - bash 中大于 32767 的数组中的随机元素

转载 作者:行者123 更新时间:2023-11-29 09:29:32 24 4
gpt4 key购买 nike

拥有:

mapfile -t words < <( head -10000 /usr/share/dict/words)
echo "${#words[@]}" #10000
r=$(( $RANDOM % ${#words[@]} ))
echo "$r ${words[$r]}"

这从 10k 单词的数组中选择一个随机单词。

但是如果数组大于 32767(例如整个文件 200k+ 字),它会停止工作,因为 $RANDOM 最多只能达到 32767。来自 man bash:

Each time this parameter is referenced, a random integer between 0 and 32767 is generated.

mapfile -t words < /usr/share/dict/words
echo "${#words[@]}" # 235886
r=$(( $RANDOM % ${#words[@]} )) #how to change this?
echo "$r ${words[$r]}"

不想使用像 perl -plE 's/.*/int(rand()*$_)/e' 这样的 perl,不是每个系统都安装了 perl。寻找最简单的可能解决方案 - 并且也不关心真正的随机性 - 它不适用于密码学。 :)

最佳答案

一个可能的解决方案是对 $RANDOM 的结果进行一些数学计算:

big_random=`expr $RANDOM \* 32767 + $RANDOM`

另一种方法是使用一次 $RANDOM 来选择输入文件的一个 block ,然后再次使用 $RANDOM 从该 block 中选择一行。

请注意,$RANDOM 不允许您指定范围。 % 给出了不统一的结果。进一步讨论:How to generate random number in Bash?

顺便说一句,将整个 words 读入内存似乎不是特别明智。除非您要多次重复访问此数据结构,否则请考虑尝试执行此操作而不要一次吞噬整个文件。

关于arrays - bash 中大于 32767 的数组中的随机元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43274825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com