我想用固定的种子随机播放 find
BUT 的输出,这样每次运行命令时我都会得到相同的输出。
这是我如何洗牌:
find . -name '*.wav' | shuf
问题是每次我们有一个新的种子 -> 新的订单。我试图修复它:
find . -name '*.wav' | shuf --random-source=<(echo 42)
这仅在某些情况下有效(即仅在少数情况下,以一种确定性的方式)。大多数时候它失败了:
shuf: ‘/proc/self/fd/12’: end of file
同样的错误是由例如产生的
seq 1 100 | sort -R --random-source=<(echo 42)
我看到有人在使用 in other places 。
这虽然有效:
printf '%s\n' a b c | shuf --random-source=<(echo 42)
这是为什么?我该如何解决?我愿意接受任何建议。
find
的输出是更大脚本的一部分。该解决方案应该适用于 bash
和 zsh
。为什么我的解决方案不起作用(编辑)
感谢@franzisk 和@Inian,我想我现在明白为什么我最初的解决方案不起作用了。我正在查看
--random-source
,因为它是一个搜索,而它是“随机源”=随机源。我的 echo 42
根本没有为超过几行的任何东西提供足够的熵。这就是为什么它只在几种情况下有效!“播种”(如:发送)大量字节可以完成这项工作,因为它提供了足够的熵。
最佳答案
您可以创建 fixed_random 函数,使用 openssl 生成随机源流,如下所示
get_fixed_random()
{
openssl enc -aes-256-ctr -pass pass:"$1" -nosalt </dev/zero 2>/dev/null
}
将函数加载到您的环境中
. /file-containing/get_fixed_random
启动 find 命令,使用随机函数将输出通过管道传送到 shuf 以提供 --random-source 选项
find . -name '*.wav' | shuf --random-source=<(get_fixed_random 55)
注意:55 只是传递的种子参数。改变它以改变随机结果
关于linux - 使用固定种子打乱 find 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60266215/