这段代码显然是一个随机数生成器,但是如何以最简单的方式使它独特?
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);
}
}
}
答案 0 :(得分:6)
对于这个少数可能的值:
答案 1 :(得分:2)
例如,PRBS31序列(x 31 + x 28 +1)保证在一个周期内只生成一个31位整数(0除外) (这是2 31 -1位长)
它也很容易实现:
public int prbs31(int state) {
int feedback = ((state >> 30) ^ (state >> 27)) & 1;
return ((state << 1) | feedback) & 0xffffffff;
}
你从一些(非零!)整数开始,然后连续调用prbs31
- 将之前的结果传回去。(这是一个反馈寄存器!)
PRBS31生成非常好的统计随机位模式(不要与truly random位模式混淆)
但是,请记住,相邻值将非常相似 - 上面建议的方法在PRBS序列上执行一位滑动窗口,这意味着每个相邻值共有30位(尽管在不同的位置)< / p>
但我们可以每次推进寄存器31步,如下:
// 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;
}
这会产生一个随机看似的整数序列,即(2 31 -1)/ 31 long
免责声明:单个LFSR的天真使用具有高度可预测性。在这种情况下,知道一个值可以了解所有未来值 - 这使得此方法适用于模拟(例如游戏),但对于任何事情都非常糟糕加密或秘密意义!
就个人而言,我使用此方法为在哈希表中用作键的对象生成唯一ID。
答案 2 :(得分:0)
最简单的方法是使用时钟算法。 如果您添加的数字不是10的因子,例如素数(差异也不是因素)你将在随机游走中获得所有可能的价值。它不是很随意,但很简单。
e.g。假设您选择10个值为3。
3, 6, 9, 2, 5, 8, 1, 4, 7, 0
答案 3 :(得分:0)
您可以生成一个随机数,将其存储在Array
/ HashMap
/无论如何并将其返回。然后,您每次都必须检查新号码是否已保存在旧号码中。
不是很有效但很容易。
答案 4 :(得分:-2)
这是随机数(整数)生成的代码示例。我们知道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));
}
}
}
希望,它会对你有帮助。