0

0

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

絕刀狂花

絕刀狂花

发布时间:2025-07-10 12:58:01

|

1072人浏览过

|

来源于php中文网

原创

我们公司主要业务是为科研单位提供数据库构建服务,目前我们已经成功帮助客户发表了三篇关于数据库的文章在《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函数来设置种子:

百度MCP广场
百度MCP广场

探索海量可用的MCP Servers

下载

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

下面是一个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

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作为随机数种子?有什么依据?我该如何选择?”实际上,只需记住两点:

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

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

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

350

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2074

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

347

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

255

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

410

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

399

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

219

2023.10.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

Excel 教程
Excel 教程

共162课时 | 12.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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