如何在ASP.NET中生成不重复的随机16位数字?

4

我如何在c# asp.net中生成16位不重复的随机数字?我已经了解了GUID的概念,它可以生成包含字符和数字的序列,但我不想要字符。请问是否有其他方法实现这个功能呢?

请提供相关建议,谢谢。


4
如果你创建一系列不重复的数字,那么它们就不能是随机的。 - Rich O'Kelly
从1开始递增*(认真的)* - Lieven Keersmaekers
我不想要一系列的数字,我需要完全随机的16位数。 - Vivek Singh
使用表格来保存您已经分发的数字,然后使用一些简单的方案来获取下一个数字。可以这样进行:获取随机数字,如果不可用:增加。写入已使用。 - Lieven Keersmaekers
1个回答

6
您可以使用Random类创建一个随机数:
private static Random RNG = new Random();

public string Create16DigitString()
{
  var builder = new StringBuilder();
  while (builder.Length < 16) 
  {
    builder.Append(RNG.Next(10).ToString());
  }
  return builder.ToString();
}

确保没有冲突需要跟踪您以前返回的所有结果,这实际上是一种内存泄漏(请注意,我不建议您使用此方法 - 跟踪所有先前的结果是一个坏主意,应该依赖于长达16个字符的随机字符串的熵来确保唯一性,如果需要更多唯一性,请增加熵,但我将包括此代码以展示如何做到):

private static HashSet<string> Results = new HashSet<string>();

public string CreateUnique16DigitString()
{
  var result = Create16DigitString();
  while (!Results.Add(result))
  {
    result = Create16DigitString();
  }

  return result;
}

它能够工作,但我想问一下这种方法是否适用于生成大量数字(比如数百万),会不会重复。 - Vivek Singh
3
我能提供的只是一个概率。一个16位数字有10^16种组合方式,我们称之为 N,创建 k 个数字的组合,它们全部都是唯一的可能性是 e^{\frac{-k(k-1)}{2N}}。使用 1000 万作为 k,这将给出一个概率为 99.004983473%。 - Rich O'Kelly
你可以将之前返回的数字写入数据库,而不是使用哈希集合。这样你仍然会有一个包含所有数字的逐渐增长的表格需要进行搜索,但是相比于在哈希中存储所有先前的数字,这对内存不应该造成太大负担。 - nedlud
@nedlud 是的,你可能可以这样做,但在我看来,这仍然是个糟糕的想法——它不能很好地扩展。 - Rich O'Kelly
感谢 @rich.okelly,我能看到它不具有可扩展性,但如果数据库和哈希表都不可扩展,那么什么方案是可扩展的呢?(我有一个类似于 OP 的问题,想知道最佳解决方案) - nedlud
@nedlud 增加熵。GUID以名称为基础具有全球唯一性,这是通过大量的熵(2^128位)实现的。在您的情况下,与GUID不同的是,您可以控制它们,并且可能有一些共享的知识可用于进一步降低碰撞的可能性(例如,如果时间被协调,则在值的某个部分编码当前时间)。如果您必须保证唯一性(统计保证不足),那么集中式来源是您唯一剩下的选择。 - Rich O'Kelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接