当前位置: 首页 > 面试题库 >

Java生成“随机”数字,该数字在2 ^ 48期间内不会重复

云俊名
2023-03-14
问题内容

基本上,我想生成不会在很长一段时间内重复的随机数(我不想使用序列),例如java使用的LCG:

 synchronized protected int next(int bits) {
       seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
       return (int)(seed >>> (48 - bits));
 }

据我了解,这种情况下的种子只会在2 ^ 48次调用next之后重复出现,这是否正确?

所以据我了解,如果我做了类似的方法

 synchronized protected long next() {
       seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
       return seed;
 }

保证种子值在2 ^ 48次调用之前不会重复吗?


问题答案:

不适用于该LCG,因为每次调用时都会修改2 ^ 48(因此,周期/状态的长度最多为2 ^
48)。如果您想要一个更好的随机数生成器,则可以尝试使用Mersenne扭曲器:

http://en.wikipedia.org/wiki/梅森_twister

标准MT19937的周期为2 ^ 19937-1(!!!),应该比您需要的更长。



 类似资料:
  • 问题内容: 我想创建一组随机数,在Java中没有重复项。 例如,我有一个数组来存储10,000个从0到9999的随机整数。 这是我到目前为止的内容: 但是上面的代码创建重复项。如何确保随机数不重复? 问题答案: 例如:

  • 问题内容: 有没有一种方法可以在JavaScript中生成指定范围内的随机数(例如1到6:1、2、3、4、5或6)? 问题答案: 重要 以下代码仅在最小值为时才有效。不适用于除以外的最小值。 如果要获得1( 且只有1 )和6 之间的随机整数,则应计算: 哪里: 1是起始号码 6是可能的结果数(1 +开始 (6) -结束 (1) )

  • 问题内容: 听起来很简单…但是我一直在努力解决这个问题,试图找到一个解决方案。 对于一个数字范围,例如 1-12 ,我想在该范围内生成一个随机序列, 并 包括 1 和 12 。 不过我不想重复数字 。 所以我想要这样的东西-3,1,8,6,5,4 ..依此类推,每个数字从1到12。 然后,我想将这些随机数放入,并使用该数组“随机”选择并在jsp页面上显示一些项目(例如从数据库中提取的清单)。 到目

  • 问题内容: Python中是否有一种简单的方法可以生成一个范围内的随机数,但不包括该范围内的某些数字子集? 例如,我知道您可以使用以下方法生成0到9之间的随机数: 如果我有一个清单,例如不想退回该怎么办? 问题答案: 尝试这个:

  • 问题内容: 如何生成(伪)随机字母数字字符串,例如:PHP中的“ d79jd8c”? 问题答案: 首先用所有可能的字符组成一个字符串: 您还可以使用range()更快地完成此操作。 然后,在一个循环中,选择一个随机数并将其用作字符串的索引以获取随机字符,然后将其附加到您的字符串中: 是随机字符串的长度。

  • 在 Java 中要生成一个指定范围之内的随机数字有两种方法:一种是调用 Math 类的 random() 方法,一种是使用 Random 类。 Random 类提供了丰富的随机数生成方法,可以产生 boolean、int、long、float、byte 数组以及 double 类型的随机数,这是它与 random() 方法最大的不同之处。random() 方法只能产生 double 类型的 0~1