【发布时间】:2011-11-17 15:45:24
【问题描述】:
我有一种情况,我需要创建数以万计的唯一数字。但是,这些数字必须是 9 位数字,并且不能包含任何 0。我目前的方法是生成 9 位数字 (1-9) 并将它们连接在一起,如果该数字不在列表中,则将其添加到其中。例如
public void generateIdentifiers(int quantity)
{
uniqueIdentifiers = new List<string>(quantity);
while (this.uniqueIdentifiers.Count < quantity)
{
string id = string.Empty;
id += random.Next(1,10);
id += random.Next(1,10);
id += random.Next(1,10);
id += " ";
id += random.Next(1,10);
id += random.Next(1,10);
id += random.Next(1,10);
id += " ";
id += random.Next(1,10);
id += random.Next(1,10);
id += random.Next(1,10);
if (!this.uniqueIdentifiers.Contains(id))
{
this.uniqueIdentifiers.Add(id);
}
}
}
但是在大约 400,000 时,由于越来越多的生成数字是重复的,因此该过程确实变慢了。我正在寻找一种更有效的方法来执行此过程,非常感谢任何帮助。
编辑:-我正在生成这些-http://www.nhs.uk/NHSEngland/thenhs/records/Pages/thenhsnumber.aspx
【问题讨论】:
-
你可以用HashTable代替List
-
“随机”和“唯一”在同一个句子中会触发“你可能做错了什么”警报。你介意解释一下你在追求什么吗?
-
Describe the goal,不仅仅是一步。不要屈服于the XY problem。
-
关于你的问题的一个有趣的事情是你错误地识别了问题的原因。它不会减慢因为有更多的碰撞。 随着检测碰撞的成本越来越高,它会减慢速度。有更多碰撞的事实是无关紧要的;这根本不是导致经济放缓的原因。导致速度变慢的原因是您选择了完全不适合检测冲突的数据结构。
-
@Joan:您必须知道 Random 的实现细节,但这很容易从 IL 进行逆向工程。您从输出中按顺序获得的每个数字都会为您提供大约 3 位关于 Random 在生成该序列时的内部状态的信息。例如,如果 Random 具有 64 位的内部状态,那么您只需大约两打输出数字就可以高概率地确定内部状态。一旦你知道了内部状态,你就知道生成的其余数字。
标签: c# performance random uniqueidentifier