我们公司主要业务是为科研单位提供数据库构建服务,目前我们已经成功帮助客户发表了三篇关于数据库的文章在《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-3awk '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函数来设置种子:
如果我们不手动设置种子,大多数编程语言会使用当前的时间戳作为随机数种子。由于每次操作的时间不同,时间戳也不同,生成的随机数序列也会不同。
下面是一个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作为随机数种子?有什么依据?我该如何选择?”实际上,只需记住两点:

以上就是竟然被awk生成的随机数给整蒙了,也谈随机数生成种子的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号