linux - 使用固定种子打乱 find 的输出

标签 linux bash random zsh

我想用固定的种子随机播放 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 的输出是更大脚本的一部分。该解决方案应该适用于 bashzsh

为什么我的解决方案不起作用(编辑)

感谢@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/

相关文章:

c - 确定性位加扰以过滤坐标

在 Linux 问题上使用 ssh 的 Java Runtime.exec()

linux - 在 Debian 机器上安装 Windows DFS 共享

c - 与 c 中的指针相关的问题

arrays - 在 for 循环中给出数组求和值

bash - 我可以使用子命令运行 watch 吗?

python - Scrapy 单个 start_url 中的随机数

linux - Windows MBR 被 linux 命令覆盖 dd if=/dev/zero of=/dev/sdb bs=512 count1

python - 确定进程是否已成功终止

javascript - 为大范围整数生成随机顺序的聪明方法?