首页 > 其他分享 >伪随机数为什么叫伪随机数

伪随机数为什么叫伪随机数

时间:2024-03-25 21:32:48浏览次数:14  
标签:为什么 静态方法 静态 Random 实例 随机数 方法

为什么Random类里面的nextInt方法不是静态的?

就是不能直接用类名调用

就是不可以

静态方法可以用类名直接调用者确实

我特地去看了一下源码

发现在伪随机数类里面确实是这样子书写的

那么为什么nextInt方法要写成实例方法呢

我查了一下资料我认为有以下几个原因

1.种子的可配置性

为什么叫伪随机数呢

因为这个类生成随机数的方法是允许程序员以计算机时间原点为统一时间。程序员可以自由控制随机数生成序列的开始点

如果他是静态的,那么就不能通过对象指定生成不同种子

静态变量是不能访问实例变量的

2.灵活性

提高了Random类的灵活性,你可以创建多个种子,在开发过程中,通过创建多个Random的实例,让每个数字都能有自己的状态,在后续进行使用的时候他们不会进行互相干扰

可以说是完完全全符合了面向对象的封装原则

通过实例方法操作内部状态,而不是通过静态方法操作全局状态

3.状态控制和更加强大

Random类的工作方式是基于一个内部的状态(种子),每次调用随机数生成方法(如nextInt)时,它都会根据当前的种子计算出一个随机数,并更新这个种子(即改变内部状态),以便下一次调用时能产生不同的随机数。如果nextInt是静态的,那么所有使用这个方法的地方都会共享相同的种子状态,这在多线程环境下会导致问题,并且限制了更灵活的随机数生成策略

由于nextInt是实例方法,所以可以在子类中重写它。这意味着你可以扩展Random类,提供自定义的随机数生成逻辑,而仍然保持与原有Random类相同的接口。如果nextInt是静态的,这种类型的扩展就不可能实现

何时声明静态方法

书写静态方法(static method)通常在以下几种情况下是合适的:

  1. 实用性函数:当你需要一个实用函数,它不依赖于对象的状态(即,它不使用任何非静态成员变量),那么将这个函数定义为静态方法是合适的。例如,一个数学工具类可能包含一些静态方法来执行数学运算。
  2. 工厂方法模式:在设计模式中,静态方法经常被用作工厂方法。工厂方法是一种创建对象的方法,而不必指定将要创建的对象的确切类别。这种情况下,静态方法可以根据输入参数的不同返回不同类的实例。
  3. 辅助方法:如果你有一些方法,它们仅仅是用来辅助类中的其他方法,而且这些方法不需要访问对象的状态,那么将它们定义为静态方法是有意义的。
  4. 状态无关的方法:如果方法的行为不依赖于对象的状态,即它不修改也不读取对象的非静态字段,那么这个方法应该被声明为静态的。
  5. 单例模式:在单例模式的实现中,通常会使用一个静态方法来获取这个唯一实例的引用。
  6. 性能考虑:由于静态方法不需要创建对象就能调用,因此在某些需要频繁调用的场景下,使用静态方法可能会略微提升性能。但这种性能优化通常很小,仅在极端性能敏感的应用中才需要考虑。

注意事项

  • 使用静态方法时,需要注意不能滥用。静态方法不能访问类的非静态成员变量或方法,这在某种程度上限制了它们的使用场景。
  • 静态方法不能被覆盖,因为它们不是通过对象实例调用的,而是通过类名调用的。这意味着静态方法的行为不会通过继承来改变。
  • 过多地使用静态方法可能会导致面向过程的编程风格,而不是面向对象的编程风格,这可能会降低代码的可读性和可维护性。

在使用静态方法时,应当仔细考虑它们是否真的适合当前的设计需求。

伪随机数

伪随机数是计算机通过随机算法生成的

计算机通过对一个变化的量进行算法处理,返回随机数给我们

而这个变化的量就是系统时间 时间是每时每分都会变化

我们通过创建对象播种 获得随机数

那么如何生成真随机数呢,扔骰子吗,1-6那确实是随机的...

好像所有的真随机数都要依赖物理设备

我想为了这个世界更加美好也值得人们去耗费时间和金钱去追求公平...

标签:为什么,静态方法,静态,Random,实例,随机数,方法
From: https://blog.csdn.net/qq_30500575/article/details/137026187

相关文章

  • 【码图】734_买票需要的时间_19行100分(含注释)_到底如何满分呢??_为什么一直达不到满分
    编写C程序实现如下功能:有n个人前来排队买票,其中第0人站在队伍最前方,第(n-1)人站在队伍最后方。给你一个下标从0开始的整数数组tickets,数组长度为n,其中第i人想要购买的票数为tickets[i]。每个人买票都需要用掉恰好1分。一个人一次只能买一张票,如果需要......
  • 为什么阿波罗机器人(Apollo)是外观最帅的机器人 ?
    资料:https://www.youtube.com/watch?v=3CdwPGC9nyk答案很简单,那就是这个公司单独找了一个外观设计团队,单独设计的外观。看来啥事情要想搞的好,那就得多花钱。......
  • 为啥富人都特别友善和随和呢?富人为什么都很和气
    为啥富人都特别友善和随和呢?富人为什么都很和气?他们为什么富有的人一般都很亲和和和蔼可亲呢?   “礼貌是不要钱的骗术,只有蠢人才会吝啬。”——叔本华 不客气的富人很容易被穷人爆气杀死。剩下的都是客气的富人。礼貌就是聪明人发明的,用来和蠢货/穷......
  • 一个操作让数组处理速度快了5倍,到底是为什么
    概述:通过对数组进行排序,代码更好地利用了缓存,从而提高了程序的性能。这种现象通常被称为"缓存友好"(cache-friendly)或"空间局部性"(spatiallocality)今天做一个数组数据计算时,发现一个效率问题,给大家分享一下一个数组排序和不排序时同样的逻辑处理速度是不一样的。排序后速度......
  • 为什么 export 导出一个字面量会报错,而使用 export default 就不会报错?
    核心其实总的来说就是export导出的是变量的句柄(或者说符号绑定、近似于C语言里面的指针,C++里面的变量别名),而exportdefault导出的是变量的值。需要注意的是:模块里面的内容只能在模块内部修改,模块外部只能使用。esModule在语法层面做了一层浅层的保护(即将import导入的变量......
  • 为什么使用类型化数组来进行字节操作而不是普通的 javascript 数字数组
    1.javascript中的数字数据类型默认为64位(8字节),无论任何数字。这意味着可以在不损失精度的情况下表示-2⁵³+1到2⁵³–1范围内的数字。这意味着即使我们想存储10个,也会消耗8个字节的内存,而这是根本不需要的。当内存效率是一个问题时,特别是在处理大型整数数组或二进制数......
  • 为什么连接数据库的端口号与配置文件中的端口号不一致?
    为什么连接数据库的端口号与配置文件中的端口号不一致?背景介绍:在安装openGauss3.0数据库时,发现配置文件中写的端口号是5432,但是数据库连接时,执行gsql--dpostgres-p5432提示错误,无法连接到数据库。报错内容:[omm@hostname]$gsql-dpostgres-p5432failedtoconn......
  • 为什么会出现段错误
    为什么会出现段错误?介绍一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。这里贴一个对于“段错误”的准确定义(参考Answers.com):Asegmentationfault(oftenshorte......
  • 传统FTP存在哪些问题?为什么一定要进行FTP替代?
    FTP在文件传输领域,可算是一位老大哥了!早出现于1970年代,那个时候,它是解决文件传输问题的最佳方案了,但是对着网络的发展,以及企业的需求变化,传统的FTP的问题就逐渐凸显出来了,所以很多企业开始寻找FTP替代的产品。我们先来看看传统FTP有哪些优势,可以风靡怎么多年:1、简单易用:FTP是......
  • Spark重温笔记(三):Spark在企业中为什么能这么强?——持久化、Checkpoint机制、共享变量与
    Spark学习笔记前言:今天是温习Spark的第3天啦!主要梳理了Spark核心数据结构:RDD(弹性分布式数据集),包括RDD持久化,checkpoint机制,spark两种共享变量以及spark内核调度原理,希望对大家有帮助!Tips:"分享是快乐的源泉......