如何用带有时间种子的 rand(来自 C++)替换 Shuf,以使我的脚本更加随机

如何用带有时间种子的 rand(来自 C++)替换 Shuf,以使我的脚本更加随机

我有一个从一组随机字符中提取 200 个字符的脚本:

tail -n+2 file.fasta | tr -d '\n' > newfile n=$(stat -c "%s" newfile) r=$(shuf -i1-"$((n-200+1))" -n1) newfile tail -c+"$r" | head -c200

有谁知道是否可以使用时间种子 (srand(time(0)) 更改 rand() 的 shuf ?我尝试更改脚本但没有成功...

有什么建议么?提前致谢

答案1

有一个名为 RANDOM 的 Bash 变量。每次读取时,其值都是 0 到 32767(含)之间的不同随机整数。范围不是很广,但也足够了。

您可以通过为 RANDOM 分配一个数字来播种随机序列。我通常使用 shell 自己的 pid 来实现此目的。

Paul--) RANDOM=$$
Paul--) for j in {1..6}; do printf ' %d' $RANDOM; done
 16928 18765 4814 6954 3017 31155
Paul--) 

不清楚为什么这shuf是不可接受的。它提供了缩放(否则您需要使用 shell 算术来完成),它具有很大的范围(高达 2^63 - 1),并且在几毫秒内执行。 (打乱文件的速度可能会很慢,因为它会在选择行之前读取整个文件,但是使用 -i 可以更智能地工作。)

如果您解释一下您还有什么进一步的要求,我们也许能够提供更好的解决方案。

相关内容