Bash 在循环中运行时,多个shuffle命令产生相同的顺序

Bash 在循环中运行时,多个shuffle命令产生相同的顺序,bash,for-loop,Bash,For Loop,我正试图使用biosquid中的命令shuffle来洗牌一些fasta文件。我为循环编写了一个简单的,,因为我想创建几个随机序列。这是密码 for i in {1..15}; do eval "shuffle -w 10 rs11979110.fasta > "$i"_rs11979110.rand"; done 我也试过 for i in {1..15}; do `shuffle -w 10 rs11979110.fasta > "$i"_rs11979110.rand`; do

我正试图使用biosquid中的命令shuffle来洗牌一些fasta文件。我为循环编写了一个简单的
,因为我想创建几个随机序列。这是密码

for i in {1..15}; do eval "shuffle -w 10 rs11979110.fasta > "$i"_rs11979110.rand"; done
我也试过

for i in {1..15}; do `shuffle -w 10 rs11979110.fasta > "$i"_rs11979110.rand`; done
但我的15个随机fasta文件有些完全相同。但是,当我在控制台中运行该命令15次时,每次的输出都是完全不同的(这是我所期望的)。我知道这是一个愚蠢的问题,但我对bash脚本还不熟悉


谢谢

如果每秒运行一次以上的
shuffle
,则需要使用
--seed
选项提供随机数种子

默认情况下,
shuffle
使用
时间(0)
对随机数生成器进行种子设定(注意1),这意味着如果您在同一秒内运行它两次,它将使用相同的种子,您将获得相同的输出

一个简单的解决方案是使用bash的
$RANDOM
变量,它将在每次调用时生成一个新值。不幸的是,这些值的范围很小,因此您可能希望使用以下值:

shuffle --seed=$((RANDOM*32768 + RANDOM)) -w 10 ...
此外,也不需要评估或回退。这样做就足够了:

for i in {1..15}; do
  shuffle --seed=$((RANDOM*32768 + RANDOM)) -w 10 rs11979110.fasta > "$i"_rs11979110.rand
done
笔记:
  • 如果您正在阅读此答案,并且负责一个需要随机数的命令行工具,这正是您不应该复制和粘贴经典的
    srand(time(NULL))
    行的原因。使用真正的随机种子,例如从
    /dev/random
    读取几个字节

  • 您的for循环是正确的,应该给出您期望的结果IMHO。您可以使用
    --seed
    选项使
    洗牌
    在每次迭代中使用不同的种子。您不需要
    eval
    也不需要反引号:

    for i in {1..15}; do shuffle -w 10 --seed ${i} rs11979110.fasta > ${i}_rs11979110.rand; done
    

    我不知道shuffle是如何生成种子的,但在for循环的执行过程中它保持不变。

    这个命令生成相同的输出,15个文件具有相同的fasta文件
    eval
    和反引号不属于那里。另外,您使用的是什么操作系统?