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位是随机生成的。所以我把它们都找回来了