竟然被awk生成的随机数给整蒙了,也谈随机数生成种子

我们公司主要业务是为科研单位提供%ign%ignore_a_1%re_a_1%构建服务,目前我们已经成功帮助客户发表了三篇关于数据库的文章在《nucleic acids research》(nar)上。你可以在我们的数据中找到这三篇文章的详细信息。

最近,一位老师急需我们构建一个数据库,但由于时间紧迫,数据尚未准备好。我们的解决方案是先用随机生成的数据作为测试,搭建数据库架构,等到真实数据准备好后,再替换这些测试数据,进行最后的测试和完善。

起初,我们使用以下码来生成随机数字,效果看起来不错,每次运行都能生成不同的随机数,符合我们的预期。

awk 'BEGIN{OFS=FS="t";}{ $2=100 * rand(); print $0;}' 00232503-7e34-479a-b6fb-0b52e78b554e.txt | cut -f 1-3 | headRnu7-186P    99.4034    ACC-3Rnu2-41P    24.6362    ACC-3
awk 'BEGIN{OFS=FS="t";}{ $2=100 * rand(); print $0;}' 00232503-7e34-479a-b6fb-0b52e78b554e.txt | cut -f 1-3 | headRnu7-186P    24.3382    ACC-3Rnu2-41P    87.6752    ACC-3

然而,当我们将这段代码放入一个for循环中时,问题出现了。每次循环生成的随机数都是相同的:

for i in *.txt; do awk 'BEGIN{OFS=FS="t";}{ $2=100 * rand(); print $0;}' $i | cut -f 1-3 | head -n 2; echo "------------"; doneRnu7-186P    99.0514    ACC-3Rnu2-41P    82.4637    ACC-3------------Rnu7-186P    99.0514    ACC-3Rnu2-41P    82.4637    ACC-3------------Rnu7-186P    99.0514    ACC-3Rnu2-41P    82.4637    ACC-3------------

我们猜测这是因为每次循环中随机数生成器的种子都是相同的,导致每次生成的随机数也相同。为了解决这个问题,我们需要在每次循环中为随机数生成器设置一个不同的种子:

for i in `seq 1 3`; do awk -v seed=$RANDOM 'BEGIN{OFS=FS="t";srand(seed);}{ $2=100 * rand(); print $0;}' 00232503-7e34-479a-b6fb-0b52e78b554e.txt | cut -f 1-3 | head -n 2; echo "------------"; doneRnu7-186P    38.0502    ACC-3Rnu2-41P    76.7106    ACC-3------------Rnu7-186P    99.1498    ACC-3Rnu2-41P    65.7196    ACC-3------------Rnu7-186P    92.9258    ACC-3Rnu2-41P    24.0214    ACC-3------------

这确实是awk的一个陷阱。

随机数生成器的种子不仅在测试时使用,在许多其他情况下,如进行Kmeans聚类、WGCNA分析和随机森林分析时,也会涉及到随机过程。每次运行结果可能不同。为了保证结果的可重复性,我们可以设置一个随机数种子。设置种子的原则是:一旦种子确定,每次运行的结果就不会改变。

通常,种子是一个整数,任何整数都可以。在课程中,我通常建议大家选择自己的幸运数字作为种子。在R语言中,我们可以通过set.seed函数来设置种子:

如果我们不手动设置种子,大多数编程语言会使用当前的时间戳作为随机数种子。由于每次操作的时间不同,时间戳也不同,生成的随机数序列也会不同。

下面是一个R语言的示例,可以看到在未设置种子时,运行rnorm(5)两次得到的结果不同。而在设置种子为10后,两次运行rnorm(5)的结果完全一致。当然,这种设置只对最近的命令有效,之后再运行rnorm(5),又会基于时间戳生成不同的数据。

# 不设置种子rnorm(5)# [1]  1.1017795  0.7557815 -0.2382336  0.9874447  0.7413901rnorm(5)# [1]  0.08934727 -0.95494386 -0.19515038  0.92552126  0.48297852

set.seed(10)rnorm(5)

[1] 0.01874617 -0.18425254 -1.37133055 -0.59916772 0.29454513

set.seed(10)rnorm(5)

[1] 0.01874617 -0.18425254 -1.37133055 -0.59916772 0.29454513

rnorm(5)

[1] 0.3897943 -1.2080762 -0.3636760 -1.6266727 -0.2564784

关于随机数种子,虽然看起来简单,但在每次课程中,总有许多老师会问到这个问题,最常见的问题是“为什么你选择10作为随机数种子?有什么依据?我该如何选择?”实际上,只需记住两点:

同一个随机数种子会生成相同的随机数序列,无论这个种子是10、20还是30。随机数种子可以是任意值,选择时可以随意,看心情选择即可,课程中选择哪个也是随机的。

竟然被awk生成的随机数给整蒙了,也谈随机数生成种子

以上就是竟然被awk生成的随机数给整蒙了,也谈随机数生成种子的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/32012.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 02:38:29
下一篇 2025年11月4日 02:50:34

相关推荐

发表回复

登录后才能评论
关注微信