【问题标题】:Random Number Generator Algorithm随机数生成器算法
【发布时间】:2012-01-05 20:29:20
【问题描述】:

银行使用什么算法来生成随机数,例如(信用卡/借记卡号码)?

假设我维护数据库中的所有数字,如果我尝试以下方法,

  1. 生成一个随机数。
  2. 验证号码是否已分配。
  3. 如果是,请转到步骤 1。
  4. 如果没有,则在数据库中为新号码创建记录并输出结果。

当卡容量增加时,它会要求更多的 db hits。

对此还有其他看法吗?请帮忙。

【问题讨论】:

  • 是什么让您认为信用卡和借记卡号码是随机的?
  • 这与您的问题无关,但信用卡号不是随机的。见en.wikipedia.org/wiki/Bank_card_number
  • 所以信用卡是连续的?虚拟帐号呢?
  • 信用卡号和银行号根本不是随机的。

标签: algorithm random numbers probability prng


【解决方案1】:

你有什么要求?我想你需要生成唯一的随机数。

在您的情况下,第 2 步可能需要很长时间,具体取决于条目数。

使用任何散列算法(如 SHA1 或 MD5)获得良好的伪随机数

这里也有一个罕见的可能性,两个条目可以有相同的随机数

为了使其完全独一无二,您可以将随机数与条目的唯一 ID 组合在一起。

例如。您有 100 个唯一 ID 为 1 到 100 的条目。要获得第 100 个条目的唯一随机数,请生成一个随机数,例如 1129642347 并将其与唯一 ID 100 合并。作为一种简单的方法,您可以使用连接。那么随机数就变成了1129642347100

【讨论】:

    【解决方案2】:

    LukeH 有一个观点。信用卡号不是随机的,它们只是对Luhn algorithm 有效的数字。 卡背面的号码(3位或4位的安全码)应该是一个随机数。

    【讨论】:

    • 它们并非完全随机,但银行确定的部分可能是随机的 - 由它们决定如何分配它们。它们肯定不是连续的。
    【解决方案3】:

    非重复随机数问题一般有三种解决方案:

    1. 如果您想要大范围的几个数字,请选择一个,如果重复则拒绝它。如果范围很大,那么这不会导致太多的重复尝试。这就是你上面提到的。

    2. 如果您想要一个小范围内的大量数字,则将所有数字设置在一个数组中并打乱数组。 Fisher-Yates algorithm 是阵列混洗的标准。从打乱的数组中依次取出随机数。

    3. 如果您需要大范围的大量数字,请使用适当大小的加密算法。例如。对于 64 位数字,使用 DES 并按顺序加密 0、1、2、3、...。输出保证唯一,因为加密是可逆的。 Hasty Pudding Cipher 可以设置为任何方便的数字范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2023-01-03
      相关资源
      最近更新 更多