C# 非重复随机字母数字码

C# 非重复随机字母数字码,c#,random,C#,Random,我的一个客户想为他的项目使用一个独特的代码,说来话长。。他问我一个解决办法。代码将由4部分组成,其中第一部分为物品寄出地的邮政编码,第二部分为供应商注册号,第三部分为物品寄出年份,最后一部分为三段字母数字唯一字符 正如您所看到的,前三部分是静态字段,对于同一个发送者,它们在同一年中永远不会改变。所以我们可以说,最后一部分是当年的标识部分。该部分为三段数字,即从000开始,以ZZZ结束 问题是,出于某些合理的原因,我的客户希望这一部分不是连续的。例如,这不是他想要的: 06450-05-2012-

我的一个客户想为他的项目使用一个独特的代码,说来话长。。他问我一个解决办法。代码将由4部分组成,其中第一部分为物品寄出地的邮政编码,第二部分为供应商注册号,第三部分为物品寄出年份,最后一部分为三段字母数字唯一字符

正如您所看到的,前三部分是静态字段,对于同一个发送者,它们在同一年中永远不会改变。所以我们可以说,最后一部分是当年的标识部分。该部分为三段数字,即从000开始,以ZZZ结束

问题是,出于某些合理的原因,我的客户希望这一部分不是连续的。例如,这不是他想要的:

06450-05-2012-000

06450-05-2012-001

06450-05-2012-002

06450-05-2012-ZZY

06450-05-2012-ZZZ

最后一部分应随机生产,如:

06450-05-2012-A17

06450-05-2012-0BF

06450-05-2012-002

06450-05-2012-T7W

06450-05-2012-22C

但它也应该是非重复性的。因此,一旦生成了可能的id,就应该从选择池中丢弃该可能性

我正在寻找一种有效的方法来做到这一点

如果我只记录选定的可能性,并对照它们检查新创建的可能性,那么最坏的情况总是可能是它不断生成已选定的可能性,尤其是在接近结束时。 如果我一次创建所有可能性并将它们记录在一个表或文件中,那么在每次项目创建之后可能需要一段时间,因为它将查找未选择的记录。顺便说一句,26个字母+10个数字表示46.656个可能的组合,并且有可能添加第4个除数,表示1.679.616个可能的组合。
你有没有更有效的建议?我将使用C进行编码,并使用MS SQL进行数据处理。

如果您希望为每个zip供应商年份元组创建远少于36^3个条目,您可能只需要为最后一个字段选择一个随机值,然后检查它是否存在,如果存在,请重复

即使您创建了可能的最大条目的一半,新条目的预期值仍然只有一个失败。假设您的数据库是根据整体标识符编制索引的,那么这并不是一个太大的代价

也就是说,如果您希望使用除少数可能的标识符之外的所有标识符,那么您可能应该提前创建所有可能的记录。这听起来可能成本很高,但内存中存储未使用记录的每个空间最终将存储一个真实记录


我认为第一种情况更可能出现,但如果不是,或者如果有其他两种情况的结合,请添加一条注释,并提供更多信息,我将修改我的答案。

如果您希望为每个zip供应商年度元组创建远少于36^3个条目,您可能只需要为最后一个字段选择一个随机值,然后检查它是否存在,如果存在,则重复

即使您创建了可能的最大条目的一半,新条目的预期值仍然只有一个失败。假设您的数据库是根据整体标识符编制索引的,那么这并不是一个太大的代价

也就是说,如果您希望使用除少数可能的标识符之外的所有标识符,那么您可能应该提前创建所有可能的记录。这听起来可能成本很高,但内存中存储未使用记录的每个空间最终将存储一个真实记录


我认为第一种情况更可能出现,但如果不是,或者如果有其他两种情况的结合,请添加一条注释,并提供更多信息,我将修改我的答案。

我认为选项取决于将要使用的代码数量:

如果您希望在一年内使用它们中的大多数,那么最好预先生成。如果做得好,查找应该非常快。无论如何,您的数据库中每年将有1.679.616项,因此您必须正确地执行这些操作

另一方面,您希望使用其中的大部分,这是否好?如果突然有比预期更多的项目,可能会使您没有代码

如果你希望只使用少量,那么随机+存在检查可能是一种方法,但是不清楚应该是多少,以达到最佳效果,我非常确定这是可以计算出来的


我认为选项取决于将要使用的代码数量:

如果您希望在一年内使用它们中的大多数,那么最好预先生成。如果做得好,查找应该非常快。无论如何,您的数据库中每年将有1.679.616项,因此您必须正确地执行这些操作

另一方面,您希望使用其中的大部分,这是否好?它可能会离开 如果突然有比预期更多的项目,请不要使用代码

如果你希望只使用少量,那么随机+存在检查可能是一种方法,但是不清楚应该是多少,以达到最佳效果,我非常确定这是可以计算出来的


如果它不一定是随机的,你可以简单地选择一个固定但不可预测的加数,它的素数为26+10==36==2²·3²。这意味着,只需选择一个既不能被2整除也不能被3整除的固定加数

然后,每次需要新的序列号时,继续将此固定号码添加到以前的序列号中。当然,这是以46656或1679616模进行的

数学保证在没有更多的自由数字之前,你不会得到相同的数字两次


作为加数,您可以使用常量整数加数=26075,因为它是5模6。

如果它不必是随机的,您可以简单地选择一个固定但不可预测的加数,该加数的相对素数为26+10==36==2²·3²。这意味着,只需选择一个既不能被2整除也不能被3整除的固定加数

然后,每次需要新的序列号时,继续将此固定号码添加到以前的序列号中。当然,这是以46656或1679616模进行的

数学保证在没有更多的自由数字之前,你不会得到相同的数字两次



作为加数,您可以使用const int addend=26075,因为它是5模6。

它真的必须是随机的还是不递增的?这听起来像是一个家庭作业。。你所说的合理理由是什么意思。。?听起来请求/分配在本质上是不合理的。你的意思是随机和不重复的部分只是最后一个3个字符吗?是的,它必须不是递增和随机的。不,这不是家庭作业。是的,只有最后一部分不应该重复。它必须是随机的还是只是不增加?这听起来像是家庭作业。。你所说的合理理由是什么意思。。?听起来请求/分配在本质上是不合理的。你的意思是随机和不重复的部分只是最后一个3个字符吗?是的,它必须不是递增和随机的。不,这不是家庭作业。是的,只有最后一部分不应该重复。如果问题是关于家庭作业的,这可能是预期的答案。它向老师展示了你知道如何使用一个完整的剩余系统来解决一个假定的真实问题。@ft1那么,我在那里会是一个很棒的学生。谢谢你的回答,虽然我的客户希望它是完全随机的,但这似乎不是一个正确的解决方案。但另一方面,这个解决方案会产生一种随机性错觉,因此它值得用来对付其他解决方案。@Kadir.K如果您创建一个固定但随机的序列,您可以将它写入数据库表,如{1,HYX},{2,OS8},{3,VVL},等等。在DB表上有相关的键/索引,速度会非常快。但我不知道这是否是一个问题,因为对于一些数字的消费者来说,HYX总是第一位的,等等。@Nielsen,虽然发送者彼此不认识,但遵循相同的模式对每个人来说都不会是一个问题。我们已经决定每年更改加数,以便每年新年第一个标识符也会更改。谢谢你的解答和问候。如果问题是关于家庭作业的,这可能是预期的答案。它向老师展示了你知道如何使用一个完整的剩余系统来解决一个假定的真实问题。@ft1那么,我在那里会是一个很棒的学生。谢谢你的回答,虽然我的客户希望它是完全随机的,但这似乎不是一个正确的解决方案。但另一方面,这个解决方案会产生一种随机性错觉,因此它值得用来对付其他解决方案。@Kadir.K如果您创建一个固定但随机的序列,您可以将它写入数据库表,如{1,HYX},{2,OS8},{3,VVL},等等。在DB表上有相关的键/索引,速度会非常快。但我不知道这是否是一个问题,因为对于一些数字的消费者来说,HYX总是第一位的,等等。@Nielsen,虽然发送者彼此不认识,但遵循相同的模式对每个人来说都不会是一个问题。我们已经决定每年更改加数,以便每年新年第一个标识符也会更改。谢谢你的解决方案和问候谢谢你的回答。的确,有36^3个组合,发送者一年发送大约1500个项目。但在未来,它可能会发送多达36^3个项目,这是我现在无法预测的。因此,可能存在一种最坏的情况,即随机生成的部分可能会重复很长时间。考虑这样一种情况,发送者已经发送了36^3-1个项目,并试图为最后一个项目创建一个记录,理论上,生成最后一个非重复的随机数字部分可能需要很长时间。谢谢你的回答。确实有36^3摄氏度
ombinations和sender每年发送大约1500件邮件。但在未来,它可能会发送多达36^3个项目,这是我现在无法预测的。因此,可能存在一种最坏的情况,即随机生成的部分可能会重复很长时间。考虑这样一种情况,发送者已经发送了36^3-1个项目,并尝试为最后一个项目创建一个记录,理论上,生成最后一个非重复的随机数字部分可能需要很长时间。谢谢你的回答,但我必须重复我为Ceykoo的帖子写的评论:确实有36^3个组合,发送者一年发送大约1500个项目。但在未来,它可能会发送多达36^3个项目,这是我现在无法预测的。因此,可能存在一种最坏的情况,即随机生成的部分可能会重复很长时间。考虑这样一种情况,发送者已经发送了36^3-1个项目,并尝试为最后一个项目创建一个记录,理论上,生成最后一个非重复的随机数字部分可能需要很长时间。谢谢你的回答,但我必须重复我为Ceykoo的帖子写的评论:确实有36^3个组合,发送者一年发送大约1500个项目。但在未来,它可能会发送多达36^3个项目,这是我现在无法预测的。因此,可能存在一种最坏的情况,即随机生成的部分可能会重复很长时间。考虑这样一种情况,发送者已经发送了36^3-1个项目,并试图为最后一个项目创建一个记录,理论上,生成最后一个非重复的随机数字部分可能要花费很长时间。