如何使用Random
C#中的类生成随机的Int64和UInt64值?
这应该可以解决问题.(这是一种扩展方法,因此您可以像调用对象上的法线Next
或NextDouble
方法一样调用它Random
).
public static Int64 NextInt64(this Random rnd) { var buffer = new byte[sizeof(Int64)]; rnd.NextBytes(buffer); return BitConverter.ToInt64(buffer, 0); }
如果你想要无符号整数,只需替换Int64
为UInt64
任何地方,所有都应该正常工作.
注意:由于没有提供关于安全性或所生成数字的期望随机性的上下文(实际上OP特别提到了Random
类),我的例子只是处理Random
类,这是随机性(通常量化为信息熵)的首选解决方案不是问题.有兴趣的话,请参阅提及的其他答案RNGCryptoServiceProvider
(System.Security
名称空间中提供的RNG ),它们几乎可以相同地使用.
使用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()
.)
在这里,你使用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); }
您可以使用位移来将31位随机数中的64位随机数组合在一起,但是您必须使用三个31位数来获得足够的位:
long r = rnd.Next(); r <<= 31; r |= rnd.Next(); r <<= 31; r |= rnd.Next();
我总是使用它来获取我的随机种子(为简洁起见,删除了错误检查):
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使用大气噪声产生随机性,显然用于彩票等.