首页 > 运维 > linux运维 > 正文

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

絕刀狂花
发布: 2025-07-10 12:58:01
原创
1041人浏览过

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

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

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

awk 'BEGIN{OFS=FS="\t";}{ $2=100 * rand(); print $0;}' 00232503-7e34-479a-b6fb-0b52e78b554e.txt | cut -f 1-3 | head
Rnu7-186P    99.4034    ACC-3
Rnu2-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 | head
Rnu7-186P    24.3382    ACC-3
Rnu2-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 "------------"; done
Rnu7-186P    99.0514    ACC-3
Rnu2-41P    82.4637    ACC-3
------------
Rnu7-186P    99.0514    ACC-3
Rnu2-41P    82.4637    ACC-3
------------
Rnu7-186P    99.0514    ACC-3
Rnu2-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 "------------"; done
Rnu7-186P    38.0502    ACC-3
Rnu2-41P    76.7106    ACC-3
------------
Rnu7-186P    99.1498    ACC-3
Rnu2-41P    65.7196    ACC-3
------------
Rnu7-186P    92.9258    ACC-3
Rnu2-41P    24.0214    ACC-3
------------
登录后复制

这确实是awk的一个陷阱。

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

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

壁纸样机神器
壁纸样机神器

免费壁纸样机生成

壁纸样机神器 0
查看详情 壁纸样机神器

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

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

# 不设置种子
rnorm(5)
# [1]  1.1017795  0.7557815 -0.2382336  0.9874447  0.7413901
rnorm(5)
# [1]  0.08934727 -0.95494386 -0.19515038  0.92552126  0.48297852
<p>set.seed(10)
rnorm(5)</p><h1>[1]  0.01874617 -0.18425254 -1.37133055 -0.59916772  0.29454513</h1><p>set.seed(10)
rnorm(5)</p><h1>[1]  0.01874617 -0.18425254 -1.37133055 -0.59916772  0.29454513</h1><p>rnorm(5)</p><h1>[1]  0.3897943 -1.2080762 -0.3636760 -1.6266727 -0.2564784
登录后复制

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

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

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

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

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号