Java 如何制作唯一的随机数生成器?
这段代码显然是一个随机数生成器,但如何以最简单的方式使其唯一Java 如何制作唯一的随机数生成器?,java,Java,这段代码显然是一个随机数生成器,但如何以最简单的方式使其唯一 import java.util.Random; public class Scramble { public static void main(String[] args) { for (int i=0; i < 10; i++) { Random randomGenerator = new Random(); int n
import java.util.Random;
public class Scramble {
public static void main(String[] args) {
for (int i=0; i < 10; i++)
{
Random randomGenerator = new Random();
int n = randomGenerator.nextInt(10);
System.out.println("Random number is " +n);
}
}
}
import java.util.Random;
公共类争用{
公共静态void main(字符串[]args){
对于(int i=0;i<10;i++)
{
Random randomGenerator=新的Random();
int n=randomGenerator.nextInt(10);
System.out.println(“随机数为”+n);
}
}
}
对于这一小部分可能的值:
最简单的方法是使用时钟算法。 如果你加上一个不是10的因子的数字,例如一个素数(差也不是因子),你将在随机游动中得到每一个可能的值。它不是很随机,但很简单 e、 假设你从10个值中选择3个
3, 6, 9, 2, 5, 8, 1, 4, 7, 0
这是生成随机数(整数)的代码示例。因为我们知道
Math.random()
总是返回双类型值。我把它转换成int
class RNumber{
public static void main(String str[]){
int countNum=100;
for(int i=0;i<countNum;i++){
System.out.println("Random Unique values="+(int)(Math.random()*100));
}
}
}
类编号{
公共静态void main(字符串str[]){
int countNum=100;
对于(int i=0;i您可以生成一个随机数,将其存储在数组中
/HashMap
/无论什么,然后返回它。然后您只需每次检查新数字是否已存在于保存的旧数字中。
不是很有效,但很容易。最大长度(如序列)适合吗
例如,PRBS31序列(x31+x28+1)保证在一个周期内(231-1位长)仅生成一次每个31位整数(0除外)
实施起来也相当容易:
public int prbs31(int state) {
int feedback = ((state >> 30) ^ (state >> 27)) & 1;
return ((state << 1) | feedback) & 0xffffffff;
}
这将生成一个看似随机的整数序列,长度为(231-1)/31
免责声明:简单地使用单个LFSR是高度可预测的。在这种情况下,知道一个值就可以知道所有未来的值-这使得这种方法适用于模拟(如游戏),但也不适用于任何具有加密或秘密意义的东西
就我个人而言,我使用此方法为用作哈希表中键的对象生成唯一ID。当你说“洗牌”时,你是指“集合”。洗牌?我不能使用此方法,因为它太高级了。实际上,没有任何更简单的解决方案。当你有一个可以高达1000000的随机数时,这不太实际,但你需要t 5 unique numbers.brice,因此在我的答案的第一行中有限制。还要注意,这个问题没有要求100万个数字中的5个。这对选择唯一元素没有任何帮助。当你只需要一个基本的伪随机数时,例如散列图的移动箱。(如果你不使用列表)对不起,我认为这个问题和我的答案一样:PIs这个随机数有用吗?当你只需要一个基本的伪随机数时,比如散列图的移动垃圾箱。(如果你不使用列表)好处是,你不需要保留任何数据结构或状态,除了你正在查看的点(例如散列)。你需要理解“唯一”和“随机”是相互矛盾的。你收集的序列中的数字越多,就越容易预测下一个,因此序列远离“随机”。使用List/Map/WhateverInterface而不是Array/HashMap/WhateVeri实现。
// initial seed, doesn't really matter which value you use
// as long as it's not zero (remember that the sequence goes over
// all the possible 31-bits values anyway)
private static final int SEED = 0x55555555;
private int state = SEED;
public int nextInt() throws SequenceCycleException {
for (int i = 0; i < 31; ++i) {
state = prbs31(state);
if (state == SEED) {
throw new SequenceCycleException();
}
}
return state;
}