在C#中生成随机值

时间:2009-03-24 13:22:39

标签: c# random long-integer int64

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

9 个答案:

答案 0 :(得分:73)

这应该可以解决问题。 (这是一种扩展方法,因此您可以像调用Next对象上的普通NextDoubleRandom方法一样调用它。

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)不是问题时,这是首选解决方案。有兴趣的话,请参阅提及RandomRNGCryptoServiceProvider命名空间中提供的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数组,用随机数据填充它,然后将其转换为longInt64)和ulongUInt64)。

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);