如何使用C#中的Random
类生成随机Int64和UInt64值?
答案 0 :(得分:73)
这应该可以解决问题。 (这是一种扩展方法,因此您可以像调用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
类),我的示例只是处理{ {1}}类,当随机性(通常量化为information entropy)不是问题时,这是首选解决方案。有兴趣的话,请参阅提及Random
(RNGCryptoServiceProvider
命名空间中提供的RNG)的其他答案,这些答案几乎可以相同地使用。
答案 1 :(得分: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);
请注意,使用Random.Next()
两次,移动一个值然后进行ORing /添加不起作用。 Random.Next()
只生成非负整数,即它生成31位而不是32位,因此两次调用的结果只产生62个随机位,而不是覆盖整个范围Int64
/所需的64位UInt64
。 (Guffa's answer显示如何使用三次调用Random.Next()
来执行此操作。)
答案 2 :(得分:9)
在这里,你使用 crytpo服务 (不是随机类),这(理论上)是一个比随机类更好的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);
}
答案 3 :(得分:6)
你可以使用位移来组合31位随机数的64位随机数,但你必须使用三个31位数来获得足够的位:
long r = rnd.Next();
r <<= 31;
r |= rnd.Next();
r <<= 31;
r |= rnd.Next();
答案 4 :(得分: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()));
random.org使用大气噪声产生随机性,显然用于彩票等。
答案 5 :(得分:3)
您没有说明如何使用这些随机数...请记住, Random 返回的值不是“加密安全的”,它们不应该用于涉及(大)秘密或(大量)金钱的事情。
答案 6 :(得分:1)
您可以创建一个byte
数组,用随机数据填充它,然后将其转换为long
(Int64
)和ulong(UInt64
)。
byte[] buffer = new byte[sizeof(Int64)];
Random random = new Random();
random.NextBytes(buffer);
long signed = BitConverter.ToInt64(buffer, 0);
random.NextBytes(buffer);
long unsigned = BitConverter.ToUInt64(buffer, 0);
答案 7 :(得分:0)
使用RNGCryptoServiceProvider
代替Random
的另一个答案。在这里,您可以看到如何删除MSB,因此结果总是正面的。
public static Int64 NextInt64()
{
var buffer = new byte[8];
new RNGCryptoServiceProvider().GetBytes(buffer);
return BitConverter.ToInt64(buffer, 0) & 0x7FFFFFFFFFFFFFFF;
}
答案 8 :(得分:-3)
Random r=new Random();
int j=r.next(1,23);
Console.WriteLine(j);