1

我正在使用随机数来生成彩票号码。但是当我尝试使用 Java 的随机生成器时

Random randomGenerator = new Random(System.currentTimeMillis());
int randomInt = randomGenerator.nextInt(totalsize);

即使使用 currentTimeMillis 作为种子,这也不会生成纯随机数。所以我正在考虑我应该保存以前的随机数,并在与旧的比较后生成新的随机数。这些随机数不是循环生成的。因此,除非存储在内存或数据库中,否则它们无法进行比较。

为了保存以前的随机数,我想了几个选项

- 要么使用 Singleton 保存它们(不知道我会怎么做以及解决方案有多好)

- 或将值保存在数据库中

-我不想实现的第三个是使用内存缓存或其他东西,因为日期只有我必须保存的 20 个数字,所以由于服务器的内存限制,它是一种过度杀伤和不可选项。

我应该使用 Singleton 还是 Database 来存储这些临时数据。如果单例,那怎么办?

我的要求是保存 10 个列表(10 种不同彩票类型中的每一种)在其中保存 2 个以前的随机值

编辑:它是一个在 tomcat 上运行的 JAVA Web 应用程序。所以简单地维护一个列表是不可能的。每次客户端点击 servlet 时,都会生成一个随机数。所以我需要从服务器发送一个随机数,与前两个值不重复。

4

3 回答 3

0

您是否知道会话(内存存储中的用户特定)如何在 tomcat(或任何应用程序服务器)上工作?一种可能性是在每个用户的会话中存储先前生成的数字(听起来最多 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);
于 2013-06-09T18:43:41.317 回答
0

如果你想要像样的随机数,你应该简单地使用SecureRandom而不是Random... 并让它从一个像样的系统级熵源中播种。

将来自“差”随机数源的数字与先前生成的数字进行比较并不能解决问题。这些数字仍将是有偏见的和/或可预测的。


另一方面,如果您的真正目标是生成 3 个不同的数字1,我建议在客户端浏览器 cookie 或服务器端会话对象中使用来实现重复消除。在后一种情况下,可能不需要持久化信息。如果用户花费太长时间来检索所有 3 个数字......太糟糕了。

1 - 严格来说,这不是一个随机数序列,因为重复项的消除引入了非随机性元素。

于 2013-06-09T06:16:58.023 回答
0

I'm not sure what you want exactly though Since you only storing the values temporarily why not store the values in arraylists as you say its part of the requirement to have 10 lists,so why not use them then compare the 2nd random numbers u generated with the numbers in the list and so on.

Eg

    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;
      }
    }

you have a list with 10 different number, create another list, generate a number ,check if the number is in the previous list if not add to current list

I'm not if this is what you wanna do but pretty much what I can gather from info you provided and description of your problem isn't much clearer to me, so hope I helped ;) Oh yea if you must then once all done you save all data in your database

于 2013-06-08T23:55:17.133 回答