生成随机唯一数字的性能问题我有一种情况需要创建数千个唯一数字。但是这些数字必须是9位数字并且不能包含任何0。我目前的方法是生成9位数字(1-9)并将它们连接在一起,如果该数字不在列表中,请将其添加到列表中。例如publicvoidgenerateIdentifiers(intquantity){uniqueIdentifiers=newList(quantity);while(this.uniqueIdentifiers.Count=0;--i){result[i]=base9[value%num];价值=价值/数量;}返回新字符串(结果);}publicstaticvoidgenerateIdentifiers(intquantity){varuniqueIdentifiers=newList(quantity);//我们有387420489(9^9)个可能的9位数字,以9为基数。//如果我们选择一个与它互为质数的数字,我们总是可以很容易地得到唯一的数字Randomrandom=newRandom();国际公司=386000000;intseed=random.Next(0,387420489);while(uniqueIdentifiers.Count我将尝试用小数字来解释背后的想法......假设你最多有7种可能的组合。我们选择一个与7成质数的数字,例如3,以及一个随机起始数字,例如as4.在每一轮中,我们将3添加到当前数字,然后我们得到对7模的结果,所以我们得到这个序列:4->4+3%7=00->0+3%7=33->3+3%7=66->6+6%7=5这样我们就以非顺序的方式生成了从0到6的所有值。在我的例子中,我们做同样的事情,但我们有9^9种可能的组合,作为素数,我选择386000000(你只需要避免3的倍数)。然后,我采用序列中的数字并将它们转换为基数9。我希望这是清楚的:)我在我的机器上对其进行了测试,生成400k个唯一值大约需要1秒。也许这会更快://我们可以生成第一个数字,在9基本系统中将在88888888-888888888之间//我们不能从零开始,因为它会在开始时产生大量的1数字intrandNumber=random.Next((int)Math.Pow(9,8)-1,(int)Math.Pow(9,9));//不,我们将数字更改为9基数,但我们将数字中的每个数字加1StringBuilderbuilder=newStringBuilder();对于(inti=(int)Math.Pow(9,8);i>0;i=i/9){builder.Append(randNumber/i+1);randNumber=randNumber%i;}id=builder.ToString();查看发布的解决方案,对我来说看起来很基本。但是,它工作并在大约1s内产生100万个值(11s内产生1000万个值)。publicstaticvoidgenerateIdentifiers(intquantity){HashSetuniqueIdentifiers=newHashSet();while(uniqueIdentifiers.Count使用字符串数组或字符串生成器,wjile使用字符串添加。更重要的是,您的代码效率不高,因为在生成许多id之后,您的列表可能包含新生成的id,因此while循环将运行超过您的需要.for循环并从这个循环中生成你的id而不是随机化。如果需要随机id,则再次使用for循环并生成超过需要的数量并给出生成间隔并从该列表中随机选择您需要的数量。使用下面的代码获取静态列表并在程序启动时填写。稍后我将添加第二个代码以生成随机ID列表。[有点忙]publicstaticRandomRANDOM=newRandom();publicstaticListrandomNumbers=newList();publicstaticListrandomStrings=newList();privatevoidfillRandomNumbers(){inti=100;而(我想首先使用StringBuilder,而不是连接-你会惊喜地发现。Antoher的东西-使用更高效的数据结构,如HashSet或HashTable。如果你可以放弃非常奇怪的要求而不是零-那么你可以当然只是使用随机操作,然后按照你想要的方式格式化你得到的数字。我认为@slugster大致是正确的-尽管你可以运行两个并行进程,一个生成数字,另一个验证它们并在验证时添加他们到可接受的数字列表中。一旦你有足够的,发出原始过程的信号。结合其他建议-使用更有效和适当的数据结构-你应该有可接受的工作......但是,为什么这样的问题需要的数量也很重要——这个要求似乎应该被分析。是这样的吗?以上就是C#学习教程:生成随机唯一数的性能问题的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicListgenerateIdentifiers2(intquantity){varuniqueIdentifiers=newList(quantity);while(uniqueIdentifiers.Countx=='0'?char.Parse(random.Next(1,10).ToString()):x).ToArray());如果(!uniqueIdentifiers.Contains(id)){uniqueIdentifiers.Add(id);}}返回唯一标识符;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: