- JAVA中随机数是哪个类来完成的?谢谢
- 请高人指教java中random函数的详细知识!本人不胜感激!谢谢了!
- java random 和 random的区别
- import java.util.Random什么意思
- 伪随机数的生成方法
生成伪随机数的类的类(生成伪随机数的程序)
大家好!今天让创意岭的小编来大家介绍下关于生成伪随机数的类的类的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等
只需要输入关键词,就能返回你想要的内容,有小程序、在线网页版、PC客户端和批量生成器
问友Ai官网:https://ai.de1919.com。
本文目录:
JAVA中随机数是哪个类来完成的?谢谢
Math 类包含基本的数字操作,如指数、对数、平方根和三角函数。与 StrictMath 类的某些数值方法不同,并不是 Math 类的所有等效函数的实现都定义为返回逐位相同的结果。这一宽限允许在不要求严格可重复性的地方实现更好的性能。
默认情况下,很多 Math 方法仅调用 StrictMath 中的等效方法来完成它们的实现。代码生成器鼓励使用特定于平台的本机库或者在可用的地方使用微处理器指令,来提供对 Math 方法的更高性能的实现。这种更高性能的实现仍然必须遵守 Math 的规范。
实现规范的质量涉及到两种属性,即返回结果的准确性和方法的单调性。浮点 Math 方法的准确性根据 ulp(units in the last place,最后一位的进退位)来衡量。对于一个给定的浮点格式,特定实数值的 ulp 是将该数值括起来的两个浮点值的差。讨论方法的准确性是从整体上考虑的,而不是针对具体的参数,引用的 ulp 数是为了考虑参数的最差情况的误差。如果一个方法的误差总是小于 0.5 ulp,则该方法始终返回最接近准确结果的浮点数;这种方法就是正确舍入。一种正确舍入的方法通常能得到最佳的浮点近似值,然而,对于很多浮点方法来说,进行正确的舍入有些不切实际。相反,对于 Math 类来说,有些方法允许误差在 1 或 2 ulp 的范围内。在非正式情况下,对于 1 ulp 的误差范围,当准确结果是可表示的数值时,应该按照计算结果返回准确结果;否则,返回将准确结果括起来的两个浮点值。对于值很大的准确结果,括号的一端可以是无穷大。除了个别参数的准确性之外,维护不同参数的方法之间的正确关系也很重要。因此,大多数误差大于 0.5 ulp 的方法都要求是半单调的:只要数学函数是非递减的,浮点近似值就是非递减的;同样地,只要数学函数是非递增的,浮点近似值就是非递增的。不是所有准确性为 1 ulp 的近似值都能自动满足单调性要求。
public class Randomextends Objectimplements Serializable此类的实例用于生成伪随机数流。此类使用 48 位的种子,使用线性同余公式对其进行修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。
如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证属性的实现,为类 Random 指定了特定的算法。为了 Java 代码的完全可移植性,Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法,只要其符合所有方法的常规协定即可。
Random 类所实现的算法使用一个 protected 实用工具方法,每次调用它都可提供最多 32 个伪随机生成的位。
很多应用程序会发现 Math 类中的 random 方法更易于使用。
请高人指教java中random函数的详细知识!本人不胜感激!谢谢了!
java.util类 Random
java.lang.Object
java.util.Random
所有已实现的接口:
Serializable
直接已知子类:
SecureRandom
--------------------------------------------------------------------------------
public class Randomextends Objectimplements Serializable此类的实例用于生成伪随机数流。此类使用 48 位的种子,使用线性同余公式对其进行修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。
如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证属性的实现,为类 Random 指定了特定的算法。为了 Java 代码的完全可移植性,Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法,只要其符合所有方法的常规协定即可。
Random 类所实现的算法使用一个 protected 实用工具方法,每次调用它都可提供最多 32 个伪随机生成的位。
很多应用程序会发现 Math 类中的 random 方法更易于使用。
从以下版本开始:
JDK1.0
另请参见:
Math.random(), 序列化表格
--------------------------------------------------------------------------------
构造方法摘要
Random()
创建一个新的随机数生成器。
Random(long seed)
使用单个 long 种子创建一个新随机数生成器: public Random(long seed) { setSeed(seed); } next 方法使用它来保存随机数生成器的状态。
方法摘要
protected int next(int bits)
生成下一个伪随机数。
boolean nextBoolean()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 boolean 值。
void nextBytes(byte[] bytes)
生成随机字节并将其置于用户提供的字节数组中。
double nextDouble()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0之间均匀分布的 double 值。
float nextFloat()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0 之间均匀分布的 float 值。
double nextGaussian()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,标准偏差是 1.0。
int nextInt()
返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
int nextInt(int n)
返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。
long nextLong()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 long 值。
void setSeed(long seed)
使用单个 long 种子设置此随机数生成器的种子。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
构造方法详细信息
Random
public Random()创建一个新的随机数生成器。此构造方法为随机数生成器的种子设置某个值,该值与此构造方法的所有其他调用所用的值完全不同。
--------------------------------------------------------------------------------
Random
public Random(long seed)使用单个 long 种子创建一个新随机数生成器:
public Random(long seed) { setSeed(seed); }next 方法使用它来保存随机数生成器的状态。
参数:
seed - 初始种子。
另请参见:
setSeed(long)
方法详细信息
setSeed
public void setSeed(long seed)使用单个 long 种子设置此随机数生成器的种子。setSeed 的常规协定是它更改此随机数生成器对象的状态,使其状态好像是刚刚使用参数 seed 作为种子创建它的状态一样。Random 类按如下方式实现 setSeed 方法:
synchronized public void setSeed(long seed) {
this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
haveNextNextGaussian = false;
}由 Random 类实现的 setSeed 恰好只使用 48 位的给定种子。但是,通常重写方法可能使用 long 参数的所有 64 位作为种子值。 注:尽管种子值是一个基本的 AtomicLong,但仍必须对此方法同步,确保 haveNextNextGaussian 的语义正确。
参数:
seed - 初始种子。
--------------------------------------------------------------------------------
next
protected int next(int bits)生成下一个伪随机数。当此数被所有其他方法使用时,子类应该重写此数。
next 的常规协定是它返回一个 int 值,并且如果参数位处于 1 和 32(包括)之间,那么返回值的多数低位都将(大致)是单独选择的位值,每个位值是 0 或 1 的机会(大致)相等。Random 类按如下方式实现 next 方法:
synchronized protected int next(int bits) {
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
return (int)(seed >>> (48 - bits));
}这是一个线性同余伪随机数生成器,由 D. H. Lehmer 定义,Donald E. Knuth 在《The Art of Computer Programming, Volume 2: Seminumerical Algorithms》的第 3.2.1 节中进行了描述。
参数:
bits - 随机位。
返回:
随机数生成器序列的下一个伪随机值。
从以下版本开始:
JDK1.1
--------------------------------------------------------------------------------
nextBytes
public void nextBytes(byte[] bytes)生成随机字节并将其置于用户提供的字节数组中。所生成的随机字节数等于该字节数组的长度。
参数:
bytes - 放入随机字节的非 null 字节数组。
从以下版本开始:
JDK1.1
--------------------------------------------------------------------------------
nextInt
public int nextInt()返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。nextInt 的常规协定是伪随机地生成并返回一个 int 值。所有 232 个可能 int 值的生成概率(大致)相同。Random 类按如下方式实现 nextInt 方法:
public int nextInt() { return next(32); }
返回:
下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
--------------------------------------------------------------------------------
nextInt
public int nextInt(int n)返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。nextInt 的常规协定是伪随机地生成并返回指定范围中的一个 int 值。所有 n 个可能 int 值的生成概率(大致)相同。Random 类按如下方式实现 nextInt(int n) 方法:
public int nextInt(int n) {
if (n<=0)
throw new IllegalArgumentException("n must be positive");
if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)next(31)) >> 31);
int bits, val;
do {
bits = next(31);
val = bits % n;
} while(bits - val + (n-1) < 0);
return val;
}
前面的描述中使用了不明确的词“大致”,只是因为 next 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 int 值。
但此算法稍微有些复杂。它拒绝那些会导致不均匀分布的值(由于 2^31 无法被 n 整除)。某个值被拒绝的概率取决于 n。最坏的情况是 n=2^30+1,拒绝的概率是 1/2,循环终止前的预计迭代次数是 2。
此算法特别对待 n 是 2 次幂的情况:它从基础的伪随机数生成器中返回正确的高位数。在不是特殊处理的情况中,将返回正确的低 位数。众所周知,线性同余伪随机数生成器(比如此类所实现的)在其低位的值序列中有 short periods。因此,如果 n 是 2 次幂(幂值较小),则这种特殊情况会导致对此方法的后续调用会返回其长度大大增加的值序列。
参数:
n - 所返回随机数的范围。必须为正数。
返回:
一个伪随机数,处于 0(包括)和 n(包括)之间均匀分布的 int 值。
抛出:
IllegalArgumentException - n 不是正数。
从以下版本开始:
1.2
--------------------------------------------------------------------------------
nextLong
public long nextLong()返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 long 值。nextLong 的常规协定是伪随机地生成并返回一个 long 值。所有 264 个可能 long 值的生成概率(大致)相同。Random 类按如下方式实现 nextLong 方法: public long nextLong() { return ((long)next(32) << 32) + next(32); }
返回:
下一个伪随机数,它是此随机数生成器的序列中均匀分布的 long 值。
--------------------------------------------------------------------------------
nextBoolean
public boolean nextBoolean()返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的 boolean 值。nextBoolean 的常规协定是伪随机地生成并返回一个 boolean 值。值 true 和 false 的生成概率(大致)相同。Random 类按如下方式实现 nextBoolean 方法:
public boolean nextBoolean() {return next(1) != 0;}
返回:
下一个伪随机数,它是此随机数生成器的序列中均匀分布的 boolean 值。
从以下版本开始:
1.2
--------------------------------------------------------------------------------
nextFloat
public float nextFloat()返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0 之间均匀分布的 float 值。
nextFloat 的常规协定是伪随机地生成并返回一个从 0.0f(包括)到 1.0f(包括)范围内均匀选择(大致)的 float 值。所有 224 个可能 float 值(其形式为 m x 2-24,其中 m 是一个小于 224 的正整数)的生成概率(大致)相同。Random 类按如下方式实现 nextFloat 方法:
public float nextFloat() {
return next(24) / ((float)(1 << 24));
}前面的描述中使用了不明确的词“大致”,只是因为 next 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 float 值。
[在 Java 的早期版本中,计算的结果是错误的,因为:
return next(30) / ((float)(1 << 30));这可能看似等效(如果不是更好的话),但实际上由于浮点数舍入中的偏差,它会导致轻微的不均匀性:有效数的低位更可能是 0 而不是 1。]
返回:
下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0 之间均匀分布的 float 值。
--------------------------------------------------------------------------------
nextDouble
public double nextDouble()返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0之间均匀分布的 double 值。
nextDouble 的常规协定是伪随机地生成并返回一个从 0.0d(包括)到 1.0d(包括)范围内均匀选择(大致)的 double 值。所有 253 个可能 float 值(其形式为 m x 2-53,其中 m 是一个小于 253 的正整数)的生成概率(大致)相同。Random 类按如下方式实现 nextDouble 方法:
public double nextDouble() {
return (((long)next(26) << 27) + next(27))
/ (double)(1L << 53);
}前面的描述中使用了不明确的词“大致”,只是因为 next 方法大致为一个单独选择位的公正来源。如果它是一个随机选择位的最佳来源,那么给出的算法应该从起始范围开始完全一致地选择 double 值。
[在 Java 的早期版本中,计算的结果是错误的,因为:
return (((long)next(27) << 27) + next(27))
/ (double)(1L << 54);这可能看似等效(如果不是更好的话),但实际上由于浮点数舍入中的偏差,它会引入较大的不均匀性:有效数的低位可能出现的 0 是 1 的三倍!这种不均匀性在实践中可能没什么关系,但是我们应该争取完美。]
返回:
下一个伪随机数,它是从此随机数生成器的序列中取出的、在 0.0 和 1.0 之间均匀分布的 double 值。
--------------------------------------------------------------------------------
nextGaussian
public double nextGaussian()返回下一个伪随机数,它是从此随机数生成器的序列中取出的、呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,标准偏差是 1.0。
nextGaussian 的常规协定是伪随机地生成并返回一个 double 值,该值从(大致)从具有平均值 0.0 和标准偏差 1.0 的常规标准分布中选择。Random 类按如下方式实现 nextGaussian 方法:
synchronized public double nextGaussian() {
if (haveNextNextGaussian) {
haveNextNextGaussian = false;
return nextNextGaussian;
} else {
double v1, v2, s;
do {
v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0
v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
double multiplier = Math.sqrt(-2 * Math.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1 * multiplier;
}
}这使用了 G. E. P. Box、M. E. Muller 和 G. Marsaglia 的 polar method,该方法在 Donald E. Knuth 的《The Art of Computer Programming, Volume 2:Seminumerical Algorithms》的第 3.4.1 节,小节 C,算法 P 中进行了描述。注意,对于一次调用 Math.log 和一次调用 Math.sqrt 而言,它生成了两个单独的值。
返回:
下一个伪随机数,它是从此随机数生成器的序列中取出的、呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,标准偏差是 1.0。
这是我从API里直接拷过来的,你可以在网上下载java api,网上有很多资源,有中文版的
java random 和 random的区别
java.lang.Math random() 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。返回值是一个伪随机选择的数,在该范围 内(近似)均匀分布。 第一次调用该方法时,它将创建一个新的伪随机数生成器,与以下表达式完全相同 new java.util.Random 之后,新的伪随机数生成器可用于此方法的所有调用,但不能用于其他地方。 此方法是完全同步的,可允许多个线程使用而不出现错误。但是,如果许多线程需要以极高的速率生 成伪随机数,那么这可能会减少每个线程对拥有自己伪随机数生成器的争用。 返回: 大于等于 0.0 且小于 1.0 的伪随机 double 值。java.util.Random 此类的实例用于生成伪随机数流。此类使用 48 位的种子,使用线性同余公式 (linear congruential form) 对其进行了修改。 如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返 回相同的数字序列。为了保证此属性的实现,为类 Random 指定了特定的算法。为了 Java 代码的完全可 移植性, Java 实现必须让类 Random 使用此处所示的所有算法。 但是允许 Random 类的子类使用其他算法, 只要其符合所有方法的常规协定即可。 Random 类实现的算法使用一个 protected 实用工具方法,每次调用它最多可提供 32 个伪随机生成 的位。 很多应用程序会发现 Math.random()方法更易于使用。
import java.util.Random什么意思
就是工具类中的随机类,此类的实例用于生成伪随机数流。没什么好解释的,查一下文档有详解的。下面是它的一些方法,看看就会了。protected
int
next(int bits)
生成下一个伪随机数。
boolean
nextBoolean()
返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值。
void
nextBytes(byte[] bytes)
生成随机字节并将其置于用户提供的 byte 数组中。
double
nextDouble()
返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0
之间均匀分布的 double 值。
float
nextFloat()
返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0
之间均匀分布的 float 值。
double
nextGaussian()
返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的 double 值,其平均值是
0.0,标准差是 1.0。
int
nextInt()
返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
int
nextInt(int n)
返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int
值。
long
nextLong()
返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
void
setSeed(long seed)
使用单个 long 种子设置此随机数生成器的种子。
伪随机数的生成方法
一般地,伪随机数的生成方法主要有以下3种:
(1) 直接法(Direct Method),根据分布函数的物理意义生成。缺点是仅适用于某些具有特殊分布的随机数,如二项式分布、泊松分布。
(2) 逆转法(Inversion Method),假设U服从[0,1]区间上的均匀分布,令X=F-1(U),则X的累计分布函数(CDF)为F。该方法原理简单、编程方便、适用性广。
(3)接受拒绝法(Acceptance-Rejection Method):假设希望生成的随机数的概率密度函数(PDF)为f,则首先找到一个PDF为g的随机数发生器与常数c,使得f(x)≤cg(x),然后根据接收拒绝算法求解。由于算法平均运算c次才能得到一个希望生成的随机数,因此c的取值必须尽可能小。显然,该算法的缺点是较难确定g与c。
因此,伪随机数生成器(PRNG)一般采用逆转法,其基础是均匀分布,均匀分布PRNG的优劣决定了整个随机数体系的优劣[7]。下文研究均匀分布的PRNG。
以上就是关于生成伪随机数的类的类相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读: