首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成随机码的类

生成随机码的类
EN

Stack Overflow用户
提问于 2014-04-07 17:06:25
回答 3查看 105关注 0票数 0

我写这个类是为了生成一个随机代码,它不应该创建任何两个重复的数字。我想知道,在这段代码中,碰撞的可能性有多大?

代码语言:javascript
复制
 public string MyRandom()
 {
    Random r = new Random();
    int x = r.Next(1000);//Max range
    PersianCalendar pc = new PersianCalendar();
     string _myrandom = pc.GetMonth(DateTime.Now).ToString() + pc.GetDayOfMonth(DateTime.Now).ToString() + pc.GetHour(DateTime.Now).ToString() + pc.GetMinute(DateTime.Now).ToString() + pc.GetSecond(DateTime.Now).ToString() + pc.GetMilliseconds(DateTime.Now).ToString() + x.ToString();

    return _myrandom;
 }
EN

回答 3

Stack Overflow用户

发布于 2014-04-07 17:10:21

如果我们这样做了

代码语言:javascript
复制
List<string> s = new List<string>();

for(int i = 0; i < 100; i++)
{
    s.Add(MyRandom());
}

为什么?当在循环中创建随机类时,可能会得到重复的随机数。More Info

解决方案:在循环外创建随机实例。

票数 0
EN

Stack Overflow用户

发布于 2014-04-07 17:16:42

票数 0
EN

Stack Overflow用户

发布于 2014-04-07 17:28:15

首先,因为使用日期的方式是这样的,所以每年只有一个可能的毫秒,其中_myrandom字符串可能会重复。

在每年的毫秒内,命中您已经生成的随机字符串的概率下降到变量x,并与您在该毫秒(以及前一年的前几毫秒)内生成的其他随机字符串的数量直接相关。例如,如果你去年在那毫秒内随机生成了10个字符串,前年生成了4个,那么今年重复的可能性是14:999,这是大约1.4%的可能性。

当然,如果每毫秒生成1000个字符串,则复制的机会是100%。

事实上,由于C#随机数生成器不会生成真正的随机数,因此复制的可能性会稍微高一些。这是一个伪随机数,所以碰撞的机会更高。

我看到你在上面的评论中写道:“这个生成器用于命名上传到我的应用程序中的照片”,这使得你不太可能每毫秒创建1000+名称。一般来说,当你以这种方式使用随机数生成器时,最好是在两种方式中的一种中加入一些错误检查: 1.攻击性或2.防御性。

攻击性将是等待错误(两个相同的文件名)发生,然后处理它(可能再次运行随机生成器,直到错误不被抛出)。防御性的做法是检查文件中的所有文件名,或者保留所有文件名的列表,以便在尝试保存文件之前检查新文件名是否不同。这更加无懈可击(因为您不需要依赖于抛出错误),但是计算成本要高得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22907997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档