我有下面的测试程序,我试图使用种子随机数使用电话号码加上当前时间。它看起来像下面是产生重复。有任何想法吗?随机代码种子生产重复
数= 100000 大小= 683
import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class Test {
static int LENGTH = 8;
static String VAULES = "";
static int cnt = 0;
public static void main(String[] args) {
Set<Long> codes = new HashSet<Long>();
for(int i = 0; i < 100000; i++){
Long seed = Long.valueOf(PHONE_VAULES) * 1000 + System.currentTimeMillis() % 1000L;
codes.add(seed);
System.out.println(generateRandomPassword(seed));
cnt = cnt + 1;
}
System.out.println("count="+ cnt);
System.out.println("size="+ codes.size());
}
public static String generateRandomPassword(long seed) {
Random random = new SecureRandom();
random.setSeed(seed);
return Long.toString(random.nextLong()).substring(1, CODE_LENGTH + 1);
}
}
不要像那样重置种子。你正在使用'SecureRandom',根本不要设置种子。你为什么设置**种子**? *使用电话号码加当前时间*是什么意思? –
@ElliottFrisch我想根据用户的电话号码和时间戳产生一个随机数,以确保它是一个随机数,但它们是唯一的。 – c12
[Pigeonhole原理](https://en.wikipedia.org/wiki/Pigeonhole_principle)表示不能保证。要么使用顺序号码生成器(1,2,3),要么计划重复项目(不管怎样,不要种下“SecureRandom” - 它是自我播种)。并且不要在每次调用'random'时更新'seed';你几乎保证不会得到一个随机的结果。 –