在C#中生成随机值

Syn*_*ter 32 c# random int64 long-integer

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

Nol*_*rin 74

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

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

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

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

  • 请注意,此方法还返回负数和Int64.MaxValue,而System.Random.Next()被约束为正数,包括0但没有Int32.MaxValue. (5认同)
  • @kd7iwp:我担心你对这里的“随机”有一点困惑。这里的关键是生成值的分布。整数是否均匀分布?是的,当然,因为它们的位是独立且均匀的随机变量。现在观察一下,(n + 1) 位数字的数量是 n 位数字的大约 10 倍,这对您来说应该足够清楚了。 (2认同)

Jon*_*eet 29

使用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);
Run Code Online (Sandbox Code Playgroud)

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


Mua*_*Dib 9

在这里,你使用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);        
}
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 6

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

long r = rnd.Next();
r <<= 31;
r |= rnd.Next();
r <<= 31;
r |= rnd.Next();
Run Code Online (Sandbox Code Playgroud)


sip*_*wiz 5

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

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()));
Run Code Online (Sandbox Code Playgroud)

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