我正在编写一个基本上处理数据并输出许多文件的程序。每次使用都不可能产生超过10-20个文件。我只是想知道使用这种方法生成唯一的文件名是一个好主意吗?是否有可能兰德会选择,让我们说x然后在10个实例中,再次选择x。使用random();
是个好主意吗?任何输入将不胜感激!
Random rand = new Random ();
int randNo = rand.Next(100000,999999)l
using (var write = new StreamWriter("C:\\test" + randNo + ".txt")
{
// Stuff
}
答案 0 :(得分:5)
我只是想知道使用这种方法生成唯一的文件名是一个好主意吗?
没有。唯一性不是随机性的属性。随机意味着结果值不以任何方式依赖于先前的状态。这意味着重复是可能的。你可以连续多次获得相同的数字(虽然不太可能)。
如果您想要唯一的值,请使用GUID:
Guid.NewGuid();
正如下面的评论所指出的,这个解决方案并非完美。但我认为它对于手头的问题已经足够好了。我们的想法是Random
被设计为随机的,Guid
被设计为唯一的。在数学上,"随机"和"独特的"是要解决的非平凡问题。
这些实现中的都不是100%完美。但重点是简单地使用两者中正确的一个来实现预期的功能。
或者,使用类比......如果你想将钉子钉在一块木头上,是否100%保证锤子会成功做到这一点?不会。锤子在接触钉子时会破碎的可能性非零。但我还是伸手去拿锤子,而不是陪审团用螺丝刀操刀。
答案 1 :(得分:4)
不,这不是在.Net中创建临时文件名的正确方法。
正确的方法是使用Path.GetTempFileName(立即创建文件)或Path.GetRandomFileName(创建高质量的随机名称)。
请注意,logging.file
,additional
,Random
生成少量文件名并没有太大问题,如其他答案中所述,但使用预期的函数用于特定目的会导致代码更容易阅读/证明正确。
答案 2 :(得分:2)
有所谓的Birthday Paradox ...如果你生成一些随机数(任何数字> 1),遇到“碰撞”的可能性会增加......如果你生成sqrt(numberofpossiblevalues)值,碰撞的可能性大约是50%...所以你有799998个可能的值...... sqrt(799998)是894 ......它很低......有45-90个你的程序调用你有一个有50%碰撞的可能性。
请注意,随机是随机的,如果生成两个随机数,则存在非零的碰撞可能性,如果生成numberofpossiblevalues + 1
个随机数,则发生碰撞的可能性为1。
现在......有人会告诉您Guid.NewGuid
将生成始终唯一的值。他们是非常好的蛇油的卖家。正如在MSDN中所写,在Guid.NewGuid
页面中......
新Guid的值全部为0或等于任何其他Guid的可能性非常低。
机会不是0,非常(非常非常我会加)低!生日悖论激活......现在......微软Guid拥有122位“随机”部分和6位“固定”部分,50%的碰撞几率发生在2.3x10 ^ 18左右。这是一个很大的数字! 1%的碰撞几率是在3.27x10 ^ 17之后......仍然是一个很大的数字!
请注意,Microsoft使用强大的随机数生成器生成这122位:https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id9
Windows使用加密API(CAPI)和下一代加密API(CNG)中的加密PRNG生成版本4 GUID。
因此虽然由Guid.NewGuid
生成的整个Guid不是完全随机的(因为6位是固定的),但它仍然是随机的。
答案 3 :(得分:2)
如果要生成唯一值,可以使用专门用于生成unqiue标识值的工具 ,即全局唯一标识符(GUID)。
var guid = Guid.NewGuid();
留下问题,找出为他人创造这种独特价值的最佳方式。
答案 4 :(得分:0)
我认为添加日期和时间是个好主意。文件在文件名中创建的时间,以确保它不重复。如果你想让它更加独特(如果你的10个文件在同一时间保存的话),你也可以为它添加随机数。
所以文件名可能是file06182015112300.txt(显示月,日,年,小时,分钟和秒)
答案 5 :(得分:0)
如果你想使用那种格式的文件,并且你知道你没有用完未使用的数字,那么检查你生成的随机数是否已经被用作如下:
<ul class = "nav navbar-nav">