我正在尝试使用biosquid中的命令shuffle
来重新播放一些fasta文件。我写了一个简单的for loop
,因为我想创建几个随机序列。这是代码
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脚本的新手
由于
答案 0 :(得分:1)
如果您每秒运行--seed
次,则需要使用shuffle
选项提供随机数种子。
默认情况下,time(0)
使用$RANDOM
(注1)为随机数生成器播种,这意味着如果您在同一秒内运行两次,它将使用相同的种子并且您将使用相同的种子。我会得到相同的输出。
一个简单的解决方案是使用bash的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
此外,不需要eval或backtics。这样就足够了:
srand(time(NULL))
/dev/random
行的原因。使用真实的随机种子,例如从HTMLElement
读取几个字节。答案 1 :(得分:1)
你的for循环是正确的,应该给出你期望的结果恕我直言。您可以使用--seed
选项使shuffle
在每次迭代时使用不同的种子。并且您不需要eval
也不需要反引号:
for i in {1..15}; do shuffle -w 10 --seed ${i} rs11979110.fasta > ${i}_rs11979110.rand; done
我不知道shuffle
如何生成它的种子,但它在for循环的执行中保持不变。