![如何用带有时间种子的 rand(来自 C++)替换 Shuf,以使我的脚本更加随机](https://linux22.com/image/184780/%E5%A6%82%E4%BD%95%E7%94%A8%E5%B8%A6%E6%9C%89%E6%97%B6%E9%97%B4%E7%A7%8D%E5%AD%90%E7%9A%84%20rand%EF%BC%88%E6%9D%A5%E8%87%AA%20C%2B%2B%EF%BC%89%E6%9B%BF%E6%8D%A2%20Shuf%EF%BC%8C%E4%BB%A5%E4%BD%BF%E6%88%91%E7%9A%84%E8%84%9A%E6%9C%AC%E6%9B%B4%E5%8A%A0%E9%9A%8F%E6%9C%BA%20.png)
我有一个从一组随机字符中提取 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 可以更智能地工作。)
如果您解释一下您还有什么进一步的要求,我们也许能够提供更好的解决方案。