Java 如何使用不同的种子生成两个随机生成器

Java 如何使用不同的种子生成两个随机生成器,java,Java,我需要两台不同种子的发电机。此代码将生成两个相同的种子 long seed=System.currentTimeMillis(); long seed2=System.currentTimeMillis(); System.out.println(seed+“,”+seed2); 输出: [12:33:28 INFO]: 1604403208374,1604403208374 制作两个不同种子的最佳方法是什么?使用不同种子制作两个随机生成器 你问: 如何使用不同的种子生成两个随机生成器 …你

我需要两台不同种子的发电机。此代码将生成两个相同的种子

long seed=System.currentTimeMillis();
long seed2=System.currentTimeMillis();
System.out.println(seed+“,”+seed2);
输出:

[12:33:28 INFO]: 1604403208374,1604403208374
制作两个不同种子的最佳方法是什么?

使用不同种子制作两个随机生成器 你问:

如何使用不同的种子生成两个随机生成器

…你暗示你可能会担心得到更真实的随机数生成器

对于a,使用类

将种子传递给构造函数

new SecureRandom( seedA )
因此,在你的情况下:

    byte[] seedA = this.getSeed() ; 
    SecureRandom randomA = new SecureRandom( seedA ) ;
    
    byte[] seedB = this.getSeed() ; 
    SecureRandom randomB = new SecureRandom( seedB ) ;
下面是一个完整的示例应用程序

/*打包任何内容;//不要放置包名*/
导入java.util.*;
导入java.lang.*;
导入java.io.*;
导入java.security.SecureRandom;
/*只有当类是公共的时,类的名称才必须是“Main”*/
表意文字
{
公共静态void main(字符串[]args)引发java.lang.Exception
{
Ideone应用程序=新Ideone();
app.demo();
}
私有void demo()
{
字节[]seedA=this.getSeed();
SecureRandom randomA=新的SecureRandoma(seedA);
字节[]seedB=this.getSeed();
SecureRandom randomB=新的SecureRandomB(seedB);
System.out.println(“randomA.nextInt()=”+randomA.nextInt());
System.out.println(“randomB.nextInt()=”+randomB.nextInt());
}
私有字节[]getSeed()
{
UUID UUID=UUID.randomUUID();
long most=uuid.getMostSignificantBits();
long least=uuid.getLeastSignificantBits();
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
DataOutputStream dos=新的DataOutputStream(bos);
尝试
{
dos.writeLong(most);
dos.writeLong(最少);
dos.flush();
}捕获(IOE异常)
{
系统输出打印ln(e);
}
byte[]bytes=bos.toByteArray();
返回字节;
}
}
看这个

randomA.nextInt()=1597393916

randomB.nextInt()=-1606028693

不是唯一的 你在评论中提到:

只要它们是独一无二的

“唯一”意味着同一个数字不会生成两次。这不是随机数发生器做出的承诺。重复将使用随机数生成器进行,这是应该的

如果您想要一个通用的唯一标识符,那么可以使用

制作两种不同种子的最佳方法 你还问:

制作两种不同种子的最佳方法是什么

我不知道。安全不是我的强项

为了好玩,在上面的代码中,我想让类生成一个随机的()通用唯一标识符(UUID)值。UUID是一个128位的值。在Java中,该值在内部存储为一对64位
long
整数基元数。在版本4中,这128位中的122位是随机生成的。因此我检索了这两个
long
数字,并将其转换为
字节数组。警告:我不知道这是个好主意还是个坏主意

你可以做一些类似的事情来生成你想发明的任何
字节[]

用不同的种子创建两个随机生成器 你问:

如何使用不同的种子生成两个随机生成器

…你暗示你可能会担心得到更真实的随机数生成器

对于a,使用类

将种子传递给构造函数

new SecureRandom( seedA )
因此,在你的情况下:

    byte[] seedA = this.getSeed() ; 
    SecureRandom randomA = new SecureRandom( seedA ) ;
    
    byte[] seedB = this.getSeed() ; 
    SecureRandom randomB = new SecureRandom( seedB ) ;
下面是一个完整的示例应用程序

/*打包任何内容;//不要放置包名*/
导入java.util.*;
导入java.lang.*;
导入java.io.*;
导入java.security.SecureRandom;
/*只有当类是公共的时,类的名称才必须是“Main”*/
表意文字
{
公共静态void main(字符串[]args)引发java.lang.Exception
{
Ideone应用程序=新Ideone();
app.demo();
}
私有void demo()
{
字节[]seedA=this.getSeed();
SecureRandom randomA=新的SecureRandoma(seedA);
字节[]seedB=this.getSeed();
SecureRandom randomB=新的SecureRandomB(seedB);
System.out.println(“randomA.nextInt()=”+randomA.nextInt());
System.out.println(“randomB.nextInt()=”+randomB.nextInt());
}
私有字节[]getSeed()
{
UUID UUID=UUID.randomUUID();
long most=uuid.getMostSignificantBits();
long least=uuid.getLeastSignificantBits();
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
DataOutputStream dos=新的DataOutputStream(bos);
尝试
{
dos.writeLong(most);
dos.writeLong(最少);
dos.flush();
}捕获(IOE异常)
{
系统输出打印ln(e);
}
byte[]bytes=bos.toByteArray();
返回字节;
}
}
看这个

randomA.nextInt()=1597393916

randomB.nextInt()=-1606028693

不是唯一的 你在评论中提到:

只要它们是独一无二的

“唯一”意味着同一个数字不会生成两次。这不是随机数发生器做出的承诺。重复将使用随机数生成器进行,这是应该的

如果您想要一个通用的唯一标识符,那么可以使用

制作两种不同种子的最佳方法 你还问:

制作两种不同种子的最佳方法是什么

我不知道。安全不是我的强项

为了好玩,在上面的代码中,我想让类生成一个随机的()通用唯一标识符(UUID)值。UUID是一个128位的值。在Java中,该值在内部存储为一对64位
long
整数基元数。在版本4中,这128位中的122位是随机生成的。所以我把它们都找回来了