带种子的Java Random总是以相同的数字开始

带种子的Java Random总是以相同的数字开始,java,random,Java,Random,编辑: 我曾尝试在网络上搜索这种行为,但到目前为止什么都没有,问题如下: 使用以下代码时: Random r2 = new Random(1); for(int p = 0; p < 25; p++) { r2 = new Random(p); System.out.println(); for(int i = 0; i < 15; i++) System.out.print(Math

编辑:

我曾尝试在网络上搜索这种行为,但到目前为止什么都没有,问题如下:

使用以下代码时:

    Random r2  = new Random(1);
    
    for(int p = 0; p < 25; p++) {
        r2 = new Random(p);
        System.out.println();
        for(int i = 0; i < 15; i++)
            System.out.print(Math.round(r2.nextFloat()*100) + " ");
        }
正如你所看到的,相同的数字总是几乎相同的(73=0.739…),如果我继续使用更长的列表,类似的数字将以10或20的一组出现,这有什么原因吗

问候,,
Jakes

您的问题似乎是关于
随机
,相似的种子值返回相似的第一个值

首先:你隐藏了大量的随机性,这些随机性是通过生成一个32位的浮点,然后将其减少到大约7位(你将其缩放到0-100并取整)

接下来:
java.util.Random
不是一个加密性很强的RNG。从某种意义上说,它“并不可怕”,但还远远不够强大。例如,它只有48位的内部状态。通过设置一个种子,您可以设置所有该状态。因为它不是一个加密性很强的RNG,所以类似的种子值可以始终如一地创建类似的输出值

由于种子值只变化了几位(使用0到24的值,这不是很多位),所以得到了预期的结果

根据您的具体目标,有两种可能的解决方案:

  • 使用一个照相强度高的RNG。由于您还希望使用固定种子,这似乎没有什么帮助
  • 使用“更多随机”种子:
  • 选择一个初始种子(可能是像
    0
  • 从中创建一个inital
    Random
    实例
  • 使用该初始
    Random
    实例,使用
    initalRandom.nextLong()
    获取其他
    Random
    对象的“真实”种子

  • 选项#2显然不是真正的加密强方案(不仅因为它还使用固定种子),但如果您只想“隐藏”随机数的非随机性对于临时观察者来说可能已经足够好了。

    因为种子是用于生成其余数字的基数。如果将种子设置为特定的数字,它将返回特定的结果。这在
    random
    中有明确的说明javadoc@Rogue当前位置我想问题是是的,这和其他贴出的问题不一样,如果你看到结果,你会发现每个种子的第一个数字都有一个重复的模式,这是不应该发生的,因为我在两个种子之间切换。关于这个问题,我主要关心的是它总是会产生相同的结果第一个生成的数字的初始小数位数相同(尽管这很难读取).关于这个问题,是的,如果我看到一个更大的样本,它会发生明显的变化,但会有一些20个种子组成的大集合共享一些相同的数字,然后会发生剧烈的变化。我不想创建一个强大的密码学,但我只是试图理解原因,如果这是一个已知的问题,因为它的PRNG,至少不应该这样。请记住,您使用PRNG的方式非常不理想:您强制内部状态为仅在极少数位上存在差异的值。一个好的PRNG应该仍然会产生完全不同的结果,即使是第一个值。但一个好的PRNG通常也很慢,并且需要更多的内部状态ate小于此值(请记住:如果内部状态小于输出,则PRNG的单个
    long
    输出足以预测下一个值!)简言之:如果你想让PRNG表现良好,那么就以一种让它表现良好的方式使用它。这很奇怪,主要是因为如果我放弃第一个结果,序列的其余部分在任何种子PRGN测试下都会表现得很好,那么,为什么这个初始输出在其余结果之外如此单调?那么我所理解的是种子会直接影响结果,而不是以索引方式影响结果,如基于给定种子的公式或操作。这并不完全正确,你有很多好的PRNG,没有这种行为,速度会更快,没有任何奇怪的结果解决方案列表应包括“对所需结果使用正确的方法”,即要获得0..100范围内的数字,应使用
    r.nextInt(100)
    而不是
    Math.round(r.nextFloat()*100)
    。那么,你就不会在结果中看到这样的模式。如果问题是为了解决问题而不是解释,那么答案是值得的。因此,在现有答案的基础上,对问题进行评论或补充,并提出解决方案是值得的。
    73 83 24 61 64 31 55 12 60 78 33 25 39 61 98 
    73 10 41 41 21 4 33 66 97 71 1 15 96 16 94 
    73 29 90 0 50 85 99 3 86 92 99 45 23 52 7 
    73 56 7 81 7 58 77 58 23 85 66 35 81 7 3 
    73 91 92 81 92 22 68 28 8 50 2 85 70 80 80 
    73 18 9 61 49 94 46 83 45 43 70 75 28 35 76 
    73 37 58 21 78 76 11 20 34 64 68 5 54 71 89 
    73 64 75 1 35 49 90 74 71 57 35 95 12 25 85 
    73 98 60 2 20 13 81 45 56 22 72 45 1 99 63 
    73 25 77 82 77 85 59 99 93 14 39 35 59 53 58 
    73 45 26 41 6 67 24 37 82 36 37 65 86 89 71 
    73 71 43 21 63 40 3 91 19 29 4 55 43 44 67 
    73 6 28 22 48 4 94 62 4 93 41 5 33 17 45 
    73 33 44 2 5 76 72 16 41 86 8 95 91 72 40 
    73 52 94 62 34 58 37 54 30 7 6 25 17 8 54 
    73 79 11 42 91 31 16 8 67 0 74 15 75 63 49 
    73 53 53 79 51 67 3 45 67 91 57 85 13 87 70 
    73 80 70 59 8 40 82 99 4 84 24 75 71 41 66 
    73 99 19 19 37 22 47 36 93 6 22 5 97 78 79 
    73 26 36 99 94 95 25 91 30 99 89 95 55 32 75 
    73 60 21 99 79 58 16 61 16 63 26 45 44 5 52 
    73 87 38 79 36 31 95 16 53 56 93 35 2 60 48 
    73 6 87 39 65 13 60 53 41 77 91 65 29 96 61 
    73 33 4 19 22 86 38 7 78 70 59 55 86 51 57 
    73 68 88 20 8 49 29 78 64 35 95 5 76 24 34