我正在使用随机数生成彩票号码。 但是当我尝试使用Java的随机生成器时
Random randomGenerator = new Random(System.currentTimeMillis());
int randomInt = randomGenerator.nextInt(totalsize);
即使将currentTimeMillis用作种子,也不会生成纯随机数。 所以我在考虑我应该保存以前的随机数,并在与旧的随机数进行比较后生成新的随机数。 这些随机数不是在循环中生成的。因此,除非存储在内存或数据库中,否则无法进行比较。
要保存以前的随机数,我想的是几个选项
- 使用Singleton保存它们(不知道我会怎么做以及解决方案有多好)
- 或者保存数据库中的值
- 我不想实现的第三个是使用内存缓存或其他东西,因为日期只有我需要保存的20个数字,所以由于服务器的内存限制,它是一个过度杀伤和超出选项。
我应该使用Singleton或Database来存储此临时数据。 如果单身,那怎么样?
我的要求是保存10个列表(10个不同的彩票类型各1个),在其中保存2个先前的随机值
编辑:它是在tomcat上运行的JAVA Web应用程序。因此,简单地维护列表是不可能的。 每次客户端命中servlet时,都会生成一个随机数。所以我需要从服务器发送一个随机数,不会重复前两个值。答案 0 :(得分:0)
我不确定你想要什么但是因为你只是暂时存储值,为什么不将值存储在arraylists中,因为你说它要求有10个列表,所以为什么不使用它们然后比较用列表中的数字生成第二个随机数u,等等。
例如
List<Integer> list1 = new ArrayList<>();
int count=10;
int random =randomGenerator.nextInt(totalsize);
While(count>0)
{
if(list1.contains(random))
continue;
else
{
list1.add(random );
--count;
}
}
你有一个包含10个不同号码的列表, 创建另一个列表,生成一个数字,检查该号码是否在上一个列表中,如果没有添加到当前列表
我不是,如果这是你想要做的,但几乎我可以从你提供的信息中收集到的,并且对你的问题的描述对我来说并不是很清楚,所以希望我能帮助;) 哦,是的,如果您必须在完成所有操作后保存数据库中的所有数据
答案 1 :(得分:0)
如果你想要体面的随机数,你应该简单地使用SecureRandom
而不是Random
...并让它从一个体面的系统级熵源中获取。
将“差”随机数源的数字与先前生成的数字进行比较并不能解决问题。这些数字仍然有偏见和/或可预测。
另一方面,如果您的真正目标是生成3个不同的数字 1 ,我建议在客户端浏览器cookie或服务器端会话对象中使用实现重复消除。在后一种情况下,可能没有必要保留信息。如果用户花费太长时间来检索所有3个数字......太糟糕了。
1 - 严格来说,这不是一系列随机数,因为重复的消除会引入一个非随机性的元素。
答案 2 :(得分:0)
您是否了解会话(内存存储中的特定用户)如何在tomcat(或任何应用程序serever)上运行?一种可能性是在每个用户的会话中存储先前生成的数字(听起来最多20个数字):
HttpSession session = request.getSession();
//
// get the previous number map from the session.
//
Map<String, List<Integer>> previousNumberMap = (Map<String, List<Integer>>) session.getAttribute("previousNumberMap");
if (previousNumberMap == null) {
previousNumberMap = new HashMap<>();
session.setAttribute("previousNumberMap", previousNumberMap);
}
//
// get the previous numbers for lottery type B
//
List<Integer> previousNumbersList = previousNumberMap.get("lotteryTypeB");
//
// find a new number that isn't in the list of previous numbers.
//
int currentNumber = random.nextInt();
while (previousNumbersList.contains(currentNumber)) {
currentNumber = random.nextInt(); // new random number
}
//
// Add the new number to the list of previous values
//
previousNumbersList.add(currentNumber);