Bash 在循环中运行时,多个shuffle命令产生相同的顺序
我正试图使用biosquid中的命令shuffle来洗牌一些fasta文件。我为循环编写了一个简单的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
,
,因为我想创建几个随机序列。这是密码
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
和反引号不属于那里。另外,您使用的是什么操作系统?