-2

我需要为满足以下要求的 C# 应用程序生成唯一编号 -。

  1. 6位数。

  2. 每天大约产生1000个号码

    byte[] buffer = Guid.NewGuid().ToByteArray();
    return string.Concat(((int)type).ToString(), 
     BitConverter.ToInt64(buffer, 0).ToString().Substring(1,    
                    6-((int)type).ToString().Length));
    

目前,我正在使用这种算法,但会出现重复,所以我想要另一个符合上述要求的算法。

4

1 回答 1

0

如果您只生成 1,000 个 6 位数字,则非常简单:

int NumberToGenerate = 1000;
Random rnd = new Random();
HashSet uniqueNumbers = new HashSet<int>();
while (uniqueNumbers.Count < NumberToGenerate)
{
    int next = Random.Next(100000, 1000000);
    uniqueNumbers.Add(next);
}

循环几乎肯定会产生一些重复,但HashSet会拒绝它们。

另一种方法是创建一个从 100,000 到 999,999 的所有数字的列表。然后,当您需要一个数字时,从列表中随机删除一个项目。

private List<int> allNumbers = new List<int>();

// in the constructor
for (var i = 100000; i < 1000000; ++i)
{
    allNumbers.Add(i);
}

private Random rnd = new Random();

public int GetNumber()
{
    var index = rnd.Next();
    var rslt = allNumbers[index];
    allNumbers.RemoveAt(index);
    return rslt;
}

打电话RemoveAt有点贵。您可以通过以下方式加快速度:

    // move the last number in the list to fill the hole
    allNumbers[index] = allNumbers[allNumbers.Count-1];
    // remove the last item
    allNumbers.RemoveAt(allNumbers.Count-1);

这将最大限度地减少在删除中移动的内存量。

或者,您可以创建所有数字的列表,将它们随机排列,然后从前面返回它们:

// assume you've created the list of numbers, as above
// Shuffle them
for (int i = 0; i < allNumbers.Count; ++i)
{
    int j = rnd.Next(i, allNumbers.Count);
    int temp = allNumbers[i];
    allNumbers[i] = allNumbers[j];
    allNumbers[j] = temp;
}

现在,您可以返回前 1,000 个数字,或者您可以编写一个方法,以便在调用时按顺序返回下一个数字。

于 2013-03-08T21:33:09.943 回答