当前位置:  开发笔记 > 编程语言 > 正文

在C#中生成随机值

如何解决《在C#中生成随机值》经验,为你挑选了5个好方法。

如何使用RandomC#中的类生成随机的Int64和UInt64值?



1> Noldorin..:

这应该可以解决问题.(这是一种扩展方法,因此您可以像调用对象上的法线NextNextDouble方法一样调用它Random).

public static Int64 NextInt64(this Random rnd)
{
    var buffer = new byte[sizeof(Int64)];
    rnd.NextBytes(buffer);
    return BitConverter.ToInt64(buffer, 0);
}

如果你想要无符号整数,只需替换Int64UInt64任何地方,所有都应该正常工作.

注意:由于没有提供关于安全性或所生成数字的期望随机性的上下文(实际上OP特别提到了Random类),我的例子只是处理Random类,这是随机性(通常量化为信息熵)的首选解决方案不是问题.有兴趣的话,请参阅提及的其他答案RNGCryptoServiceProvider(System.Security名称空间中提供的RNG ),它们几乎可以相同地使用.


请注意,此方法还返回负数和Int64.MaxValue,而System.Random.Next()被约束为正数,包括0但没有Int32.MaxValue.

2> Jon Skeet..:

使用Random.NextBytes()BitConverter.ToInt64/ BitConverter.ToUInt64.

// Assume rng refers to an instance of System.Random
byte[] bytes = new byte[8];
rng.NextBytes(bytes);
long int64 = BitConverter.ToInt64(bytes, 0);
ulong uint64 = BitConverter.ToUInt64(bytes, 0);

请注意,使用Random.Next()两次,移动一个值,然后进行ORing /添加不起作用.Random.Next()仅产生非负整数,即,其产生31位,而不是32,所以两个呼叫的结果仅产生62个随机比特,而不是覆盖的全部范围所需的64个比特Int64/ UInt64.(Guffa的答案显示了如何通过三次调用来完成它Random.Next().)



3> Muad'Dib..:

在这里,你使用crytpo服务 (不是Random类),它(理论上)是一个比Random类更好的RNG.您可以轻松地将其作为Random的扩展,或者创建自己的Random类,其中RNGCryptoServiceProvider是类级别的对象.

using System.Security.Cryptography;
public static Int64 NextInt64()
{
   var bytes = new byte[sizeof(Int64)];    
   RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
   Gen.GetBytes(bytes);    
   return BitConverter.ToInt64(bytes , 0);        
}



4> Guffa..:

您可以使用位移来将31位随机数中的64位随机数组合在一起,但是您必须使用三个31位数来获得足够的位:

long r = rnd.Next();
r <<= 31;
r |= rnd.Next();
r <<= 31;
r |= rnd.Next();



5> sipwiz..:

我总是使用它来获取我的随机种子(为简洁起见,删除了错误检查):

m_randomURL = "https://www.random.org/cgi-bin/randnum?num=1&min=1&max=1000000000";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(m_randomURL);
StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());
Random rand = new Random(Convert.ToInt32(stIn.ReadToEnd()));

random.org使用大气噪声产生随机性,显然用于彩票等.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有