将最后生成的随机数保存在内存java Web App中

时间:2013-06-08 21:53:20

标签: java singleton

我正在使用随机数生成彩票号码。 但是当我尝试使用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时,都会生成一个随机数。所以我需要从服务器发送一个随机数,不会重复前两个值。

3 个答案:

答案 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);