使用VB代码生成当日唯一short类型数字,能否确保100%无重复?
问题:验证当日唯一Short类型数字生成代码的唯一性
需求与代码
需要生成当日唯一的数字,且必须使用short类型(取值范围0-32767,不可使用负数),计划通过时分信息实现,以下是VB代码:
Dim ora As String = dataora.Substring(6, 2) 'es. 07 Dim minuti As String = dataora.Substring(8, 2) 'es 14 Dim parteOra = ora * 1000 Dim parteMinuti = rando.Next(0, 708) Dim parteFinale = rando.Next(0, 9000) Dim CUL as short = CShort(parteOra + (minuti + parteMinuti) + parteFinale)
疑问与逻辑分析
疑问
上述代码能否100%确保当日生成的数字始终唯一?
我的逻辑
- 24小时制的小时数为0-23的唯一值
- 同一小时内的分钟数为0-59的唯一值
parteOra的取值范围为0-23000minuti + parteMinuti的取值范围为0-767parteFinale的取值范围为0-9000- 三者总和的取值范围应为0-32767
回答
无法100%确保当日生成的数字唯一,核心原因如下:
- 代码引入了
rando.Next()生成随机数(parteMinuti和parteFinale),随机数本身不具备唯一性保证,哪怕重复概率极低,也存在不同生成请求得到相同CUL值的可能。 - 即使在同一时分多次生成,随机数的随机性会导致总和重复;不同时分的组合也可能因为随机数的取值巧合,让最终的
CUL值完全一致。 - 时分信息本身的唯一性被随机数破坏——随机数的作用是增加随机性,而非保障唯一性,这和你“生成唯一数字”的目标矛盾。
另外补充一个细节:rando.Next(0, 708)生成的是0到707的整数(Next方法的第二个参数是排他上限),所以minuti + parteMinuti的实际最大值是59+707=766,而非你认为的767;同理parteFinale的最大值是8999,三者总和最大值为23000+766+8999=32765,确实在short的取值范围内,不会出现溢出问题。
内容的提问来源于stack exchange,提问作者Gabriele Cozzolino
相关产品推荐
相关产品推荐

