1

我正在开发一个应用程序,它将生成唯一的随机数,然后将它们存储到数据库中。我将通过 HTTP 请求检查号码是否存在。一开始,我会使用大约 10,000 个数字。

这是正确的方法吗?

  1. 生成一个随机数,一个一个的存入一个数组,继续检查数组的唯一性,当数组完成后,将整个数组排序后存入数据库。
  2. 使用数据库并检查一个数字是否存在。

我应该使用哪个数据库,因为应用程序可以扩展到 100 万个数字。

4

2 回答 2

1

它可能更有效,特别是如果您想生成 1000000 个数字,一次使它们一个,并在模型/数据库中使用验证来防止重复。

至于选择数据库,这将取决于您的预期应用程序。这里有一些信息:哪个是 Rails 应用程序的最佳数据库?

我无法评论直接从没有rails的ruby使用数据库,因为我没有这样做。对我来说,rails 的一大优点是它使创建使用数据库的应用程序变得多么容易。

于 2013-04-27T09:39:44.340 回答
1

几个想法:

  1. 如果您要存储 10 或 10,000 个“随机”数字,它们是随机进入数据库,还是数据库随机选择 10,000 个连续数字范围内的一个数字,有什么区别?你需要双随机数选择吗?MySQL、PostgreSQL 和其他 DBM 可以生成随机数,您可以使用它们的随机数生成器来检索一行,因此您可以让它直接从其生成器返回一个值,或者抓取一行。无论哪种方式,您都无需担心 Ruby 会创建随机值——除非您真的想要“三重”随机数。我只需将一个(1..10_000)范围的值粘贴到数据库中,然后调用该部分完成并处理查询以随机获取记录。
  2. 如果您想要真正的随机数,则无法保证唯一性。如果您对伪随机感到满意,那么您仍然会遇到问题,因为您最终可能会从范围内返回重复项,除非您跟踪您之前在特定会话中使用过哪些数字。如果您的网站变得流行,您如何在一堆会话中跟踪唯一性将是一个有趣的问题。

如果我这样做,我会颠倒一些过程。我不会将“随机”值存储在数据库中,我会使用 Ruby 的内置随机数生成器,然后可能会检查数据库以查看我之前是否为该特定会话生成了该数字。总体而言,数据库中存储的值更少,因此确定唯一性的查找会更快。

这仍然是一个笨拙的编码系统,并且随着会话的“唯一”记录的增长,效率会随着时间的推移而变得低​​下。

要在没有数据库的情况下执行此操作,我会使用类似的东西创建随机/唯一范围:array = (1..10_000).to_a.shuffle,然后每次我需要一个值时,我都会使用pop从随机数组中提取最后一个值。我很想从所有会话的值池中提取,直到它用尽,然后重新生成它。此时可能会出现重复的“唯一”值,但同一数字连续出现两次的可能性很小。

于 2013-04-27T14:53:32.060 回答