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

时间:2015-08-05 21:35:30

标签: bash for-loop

我正在尝试使用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脚本的新手

由于

2 个答案:

答案 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))

注意:

  1. 如果您正在阅读此答案并负责需要随机数的命令行工具,这正是您不应复制并粘贴经典/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循环的执行中保持不变。