我们现在主要的一个业务是给科研单位等提供数据库构建服务,目前承接的数据库已经发表了3NAR文章,具体见你的数据也可以-三篇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自己的坑了。

In most awk implementations, including gawk, rand() starts generating numbers from the same starting number, or seed, each time you run awk. Thus, a program generates the same results each time you run it. The numbers are random within one awk run but predictable from run to run. This is convenient for debugging, but if you want a program to do different things each time it is used, you must change the seed to a value that is different in each run. To do this, use srand().

随机数生成器的种子

除了在显示生成随机数做测试时会用到随机数生成器,很多其它时候比如做Kmeans聚类时WGCNA分析时, 随机森林分析时也都会有随机过程,每次运行结果都有可能不同,为了保证结果的可重复性,这时就可以设置一个随机数种子。其原则是:种子定了,每次运行结果也就不会变了

通常这个种子是一个整数,任意整数都可以。讲课时,我一般说大家可以选择自己的幸运数字来设置,在R中通常通过函数set.seed来设置:

通常,如果我们没有自己设置种子,大部分程序语言中会调用当前的时间戳作为随机数的种子,每次操作时间都不同,时间戳也就不同,获得的随机数序列也就不同。

下面是一个R中的示例,可以看到前面两次运行rnorm(5)获得的返回值都不同。而在设置set.seed(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.48297852set.seed(10)
rnorm(5)
# [1]  0.01874617 -0.18425254 -1.37133055 -0.59916772  0.29454513set.seed(10)
rnorm(5)
# [1]  0.01874617 -0.18425254 -1.37133055 -0.59916772  0.29454513rnorm(5)
[1]  0.3897943 -1.2080762 -0.3636760 -1.6266727 -0.2564784

关于随机数种子,虽然看上去比较简单,但每次课程,总会有多位老师问起,问起最多的就是为什么你选择10作为随机数种子?依据是什么?我怎么选?实际就记住两点:

  1. 同一个随机数种子获得的随机数序列是一致的,不管这个种子是10, 20还是 30

  2. 随机数种子可以是任意值,看心情选择就好,课程中选哪个也都是随机的。

这个为生信学习和生信作图打造的开源R教程真香!!!

这个为生信学习打造的开源Linux教程真香!!!

往期精品(点击图片直达文字对应教程)

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

(请备注姓名-学校/企业-职务等)

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

  1. js生成的随机数的方法

    js随机数 在javascript中用来生成随机熟的方法是Math下的random方法: random():函数返回从0到1之间的一个浮点数,包括0但是不包括1, 获取 两个数之间的随机整数,不包括不 ...

  2. 算法:关于生成抽样随机数的这些算法

    概述: 这里你是不是会说,生成随机数有什么难的?不就是直接使用Java封装好了的random就行了么?当然对于一般情况下是OK的,而且本文要说明的这些算法也是基于这个random库函数的. 本文主要是 ...

  3. python random.seed()函数 (生成固定随机数)random.seed(None)(取消固定随机数种子)

    我们调用 random.random() 生成随机数时,每一次生成的数都是随机的. 但是,当我们预先使用 random.seed(x) 设定好种子之后,其中的 x 可以是任意数字,如10,这个时候,先 ...

  4. 随机抽样java_java生成抽样随机数的多种算法

    本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示. 概述: 这里你是不是会说,生成随机数有什么难的?不就是直接使用Java封装好了的random就行了么?当然对于一般情况下是OK的,而 ...

  5. 如何正确地生成一个随机数

    参考文章 笔记 | 如何正确地生成一个随机数 CF曾提到:Don't use rand(): a guide to random number generators in C++ 文章总结: 1 .r ...

  6. C# Random生成相同随机数的解决方案

    C# Random生成相同随机数的解决方案 参考文章: (1)C# Random生成相同随机数的解决方案 (2)https://www.cnblogs.com/liwuyi/archive/2013/ ...

  7. 【Python】如何生成柯西分布随机数

    Python中生成标准柯西分布的函数是:numpy.random.standard_cauchy(size), 我就在想,能否生成一个非标准的柯西随机数呢?那么面临几个问题: (1)标准柯西随机数和非 ...

  8. 获取连续生成的100-200范围的随机数,直到生成的随机数与前一个随机数相等,停止运行

    编写程序,获取连续生成的100-200范围的随机数,直到生成的随机数与前一个随机数相等,停止运行 题目:编写程序,获取连续生成的100-200范围的随机数,直到生成的随机数与前一个随机数相等,停止运行 ...

  9. 用C++生成一个随机数

    用C++生成一个随机数 文章目录 用C++生成一个随机数 C++语言生成随机数的办法 通用公式 : 例 (例中的随机数生成公式为通用公式) C++语言生成随机数的办法 1.使用rand()函数返回从[ ...

最新文章

  1. TextInputLayout
  2. OpenCV中CV_IS_MAT_CONT(src->type dst->type) 的含义
  3. DL之Perceptron:Perceptron感知器(感知机/多层感知机/人工神经元)的简介、原理、案例应用(相关配图)之详细攻略
  4. 计算机强势专业大学,计算机专业实力最强的6所大学,认可度高,竞争优势大,值得选择...
  5. 使用jenkins实现监控嵌入式设备稳定性之二----脚本部分
  6. jQuery data
  7. 复盘二进制的习题(2)
  8. C++程序员拼命工作却不顾身体,是不值得的!
  9. CocoaPods pod install
  10. 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 线性回归
  11. 运行Maven是报错:No goals have been specified for this build
  12. 防止***根据PHP中的错误信息爆路径
  13. 腾讯云图(TCV)使用指南
  14. 深夜的呼唤,无尽的力量
  15. cpp-http 库的使用
  16. win10注册表WOW6432Node
  17. [附源码]计算机毕业设计校园运动会管理系统Springboot程序
  18. DRB-GAN: A Dynamic ResBlock Generative Adversarial Network for Artistic Style Transfer
  19. 单片机程序跑飞的原因
  20. C语言开发情人节玫瑰

热门文章

  1. 作者:孔新川,杭州迈宁数据科技有限公司创始人、CEO。
  2. 线段覆盖(洛谷P1803题题解,C++语言描述)
  3. 质因子分解(洛谷P2043题题解,Java语言描述)
  4. 统计范围内不含‘7‘的数字个数(洛谷P1590题题解,Java语言描述)
  5. 合理抽象灵活运用排列组合(洛谷P2181题题解,Java语言描述)
  6. web 服务器和 web 技术发展历史简介
  7. 前端工程师和数据科学的快乐
  8. Java知识点总结(注解-内置注解)
  9. div背景透明内容不透明与0.5PX边框兼容设置
  10. spring-data-jpa 查询视图