不要随便设置随机种子

  随机数在太多的地方使用了,比如加密、混淆数据等,我们使用随机数是期望获得一个唯一的、不可仿造的数字,以避免产生相同的业务数据造成混乱。在Java项目中通常是通过Math.random方法和Random类来获得随机数的,我们来看一段代码:

  1. public class Client {
  2. public static void main(String[] args) {
  3. Random r = new Random();
  4. for(int i=1;i<4;i++){
  5. System.out.println("第"+i+"次:"+r.nextInt());
  6. }
  7. }
  8. }

代码很简单,我们一般都是这样获得随机数的,运行此程序可知:三次打印的随机数都不相同,即使多次运行结果也不同,这也正是我们想要随机数的原因。我们再来看下面的程序:

  1. public class Client {
  2. public static void main(String[] args) {
  3. Random r = new Random(1000);
  4. for(int i=1;i<4;i++){
  5. System.out.println("第"+i+"次:"+r.nextInt());
  6. }
  7. }
  8. }

上面使用了Random的有参构造,运行结果如下:

  1. 第1次:-498702880
  2. 第2次:-858606152
  3. 第3次:1942818232

计算机不同输出的随机数也不同,但是有一点是相同的:在同一台机器上,甭管运行多少次,所打印的随机数都是相同的,也就是说第一次运行,会打印出这三个随机数,第二次运行还是打印出这三个随机数,只要是在同一台硬件机器上,就永远都会打印出相同的随机数,似乎随机数不随机了,问题何在?

那是因为产生随机数的种子被固定了,在Java中,随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:

种子不同,产生不同的随机数。

种子相同,即使实例不同也产生相同的随机数。

看完上面两个规则,我们再来看这个例子,会发现问题就出在有参构造上,Random类的默认种子(无参构造)是System.nanoTime()的返回值(JDK 1.5版本以前默认种子是System. currentTimeMillis()的返回值),注意这个值是距离某一个固定时间点的纳秒数,不同的操作系统和硬件有不同的固定时间点,也就是说不同的操作系统其纳秒值是不同的,而同一个操作系统纳秒值也会不同,随机数自然也就不同了。(顺便说下,System.nanoTime不能用于计算日期,那是因为“固定”的时间点是不确定的,纳秒值甚至可能是负值,这点与System. currentTimeMillis不同。)

new Random(1000)显式地设置了随机种子为1000,运行多次,虽然实例不同,但都会获得相同的三个随机数。所以,除非必要,否则不要设置随机种子。

顺便提一下,在Java中有两种方法可以获得不同的随机数:通过java.util.Random类获得随机数的原理和Math.random方法相同,Math.random()方法也是通过生成一个Random类的实例,然后委托nextDouble()方法的,两者是殊途同归,没有差别。

注意 若非必要,不要设置随机数种子。

时间: 2024-10-07 01:11:15

不要随便设置随机种子的相关文章

[Tips] pyton 设置随机种子

对于原生的random模块 import random random.seed(1) 如果不设置,则python根据系统时间自己定一个. 也可以自己根据时间定一个随机种子,如: import time import random seed = int(time.time()) random.seed(seed) 原文地址:https://www.cnblogs.com/immortalBlog/p/11511162.html

java中Random随机种子使用

在java中,通过Random生成随机数时,如果设置随机种子,则相同的种子,产生的随机数相同.若不设置则每次随机的不同. Random rnd = new Random(); rnd.setSeed(10);//用于设置种子. rnd.nextInt();// 用于产生随机数. rnd.nextInt(10); // 产生(0-9)数字.

随机种子random_state,random seed

首先random_state和random seed是一样的,都是设置随机种子 在许多模型中都有random_state,例如SVC, ShuffleSplit()等,在模型中设置random_state作用就是可以使每次用相同的训练集相同参数可以得到相同的结果.不然的话,每训练一次,结果就会有波动.如果random_state都设置好,当别人拿到你的代码运行时就能得到和你一样的结果,复现你的过程. 特别注意:随机种子设置为0的时候结果也是一样的,除了不设置或设置为None时,产生的结果会不同

c++ rand随机数生成(随机种子设置)

需求:每次初始化不同的随机数 1.默认 //这样用每次都会产生相同数字 #include <stdlib.h> #include <stdio.h> #define N 10 int main(void) { int i; for (i = 0; i < N; i++) printf("%d", rand()%100+1); return 0; } 2.随机种子 //这样用就不一样了 #include <stdlib.h> #include &

机器学习中的参数:随机种子(random_state)

random_state是一个随机种子,是在任意带有随机性的类或函数里作为参数来控制随机模式.当random_state取某一个值时,也就确定了一种规则. random_state可以用于很多函数,我比较熟悉的是用于以下三个地方:1.训练集测试集的划分 2.构建决策树 3.构建随机森林 1.划分训练集和测试集的类train_test_split 随机数种子控制每次划分训练集和测试集的模式,其取值不变时划分得到的结果一模一样,其值改变时,划分得到的结果不同.若不设置此参数,则函数会自动选择一种随机

[BZOJ2296] [POJ Challenge] 随机种子

Description 1tthinking除了随机算法,其他什么都不会.但是他还是可以ac很多题目,他用的是什么呢?他会选择一个好的随机种子,然后输出答案.往往他选择的一个好的种子可以有99%的概率ac题目. 他会按照下面的规则选择一个种子.首先1tthinking有自己喜欢的一个幸运数字 x.然后他会找一个数字 a 使得 (1)a is a 是 x 的倍数 (2) a 的十进制表示包含0到9. 举个例子, 如果 x = 1, 那么 9182736450 就是一个1tthinking需要的随机

Windows 10 设置随机播放 桌面背景(壁纸)的方法

在刚刚发布Windows 10里,壁纸无法设置随机播放了,只能一个接一个的顺序播放. 要想进行随机播放,在命令行执行这条命令,即可调出传统的设置界面: control /name Microsoft.Personalization /page pageWallpaper 然后,把“无序播放”勾选即可,如图: 来源:https://www.reddit.com/r/wallpapers/comments/3fec2g/windows_10_random_wallpaper_slideshow/

BZOJ2296: 【POJ Challenge】随机种子

2296: [POJ Challenge]随机种子 Time Limit: 1 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 114  Solved: 54[Submit][Status] Description 1tthinking除了随机算法,其他什么都不会.但是他还是可以ac很多题目,他用的是什么呢?他会选择一个好的随机种子,然后输出答案.往往他选择的一个好的种子可以有99%的概率ac题目. 他会按照下面的规则选择一个种子.首先1tt

Scrapy 设置随机 User-Agent

方式一:在每个 Spider中设置(针对单个Spider) class TencentSpider(scrapy.Spider): name = 'tencent' allowed_domains = ['hr.tencent.com'] headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/