如何在C#中生成随机整数?
当前回答
这是我使用的类。工作方式类似RandomNumber.GenerateRandom(1666)
internal static class RandomNumber
{
private static Random r = new Random();
private static object l = new object();
private static Random globalRandom = new Random();
[ThreadStatic]
private static Random localRandom;
public static int GenerateNewRandom(int min, int max)
{
return new Random().Next(min, max);
}
public static int GenerateLockedRandom(int min, int max)
{
int result;
lock (RandomNumber.l)
{
result = RandomNumber.r.Next(min, max);
}
return result;
}
public static int GenerateRandom(int min, int max)
{
Random random = RandomNumber.localRandom;
if (random == null)
{
int seed;
lock (RandomNumber.globalRandom)
{
seed = RandomNumber.globalRandom.Next();
}
random = (RandomNumber.localRandom = new Random(seed));
}
return random.Next(min, max);
}
}
其他回答
创建随机对象
Random rand = new Random();
并使用它
int randomNumber = rand.Next(min, max);
你不必每次需要一个随机数时都初始化新的Random(),先初始化一个Random,然后在循环中使用它,或者其他
对于强随机种子,我总是使用CryptoRNG而不是时间。
using System;
using System.Security.Cryptography;
public class Program
{
public static void Main()
{
var random = new Random(GetSeed());
Console.WriteLine(random.Next());
}
public static int GetSeed()
{
using (var rng = new RNGCryptoServiceProvider())
{
var intBytes = new byte[4];
rng.GetBytes(intBytes);
return BitConverter.ToInt32(intBytes, 0);
}
}
}
如其他答案中所述,一个好的安全方法是使用安全密码生成器。这里的所有示例都显示了RNGCryptoServiceProvider的用法,与我建议的解决方案相比,它编写的代码很长。
使用RandomNumberGenerator,它是在密码学API之上编写的。它和RNGCryptoServiceProvider一样安全,并且具有相同的随机性。
// Gives a random number for the integer range.
// You can simply update the parameters as your needs.
RandomNumberGenerator.GetInt32(int.MinValue, int.MaxValue);
我总是有生成随机数的方法,这些方法有助于实现各种目的。我希望这也能帮助您:
public class RandomGenerator
{
public int RandomNumber(int min, int max)
{
var random = new Random();
return random.Next(min, max);
}
public string RandomString(int size, bool lowerCase)
{
var builder = new StringBuilder();
var random = new Random();
char ch;
for (int i = 0; i < size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}
if (lowerCase)
return builder.ToString().ToLower();
return builder.ToString();
}
}
这个问题看起来很简单,但答案有点复杂。如果你看到几乎所有人都建议使用Random类,有些人建议使用RNG加密类。但是,什么时候选择。
为此,我们需要首先理解随机性这一术语及其背后的哲学。
我鼓励大家观看我制作的这段视频,它使用C#深入探讨了随机性的哲学https://www.youtube.com/watch?v=tCYxc-2-3年
首先,让我们了解随机性的哲学。当我们告诉一个人在红色、绿色和黄色之间选择时,内部会发生什么。是什么让一个人选择红色、黄色或绿色?
一些最初的想法进入了人们的头脑,决定了他的选择,它可以是最喜欢的颜色,幸运的颜色等等。换句话说,一些最初的触发,我们在RANDOM中称之为SEED。这个SEED是起点,是促使他选择RANDOM值的触发。
现在,如果种子很容易猜测,那么这些随机数被称为伪随机数,而当种子很难猜测时,这些随机数则被称为安全随机数。
例如,一个人根据天气和声音组合选择颜色,那么很难猜出最初的种子。
现在让我发表一个重要声明:-
*“Random”类只生成PSEUDO随机数,要生成SECURE随机数,我们需要使用“RNGCryptoServiceProvider”类。
随机类从CPU时钟中获取种子值,这是非常可预测的。换句话说,C#的RANDOM类生成伪随机数,下面是相同的代码。
Random random = new Random();
int randomNumber = random.Next();
而RNGCryptoServiceProvider类使用OS熵生成种子。OS熵是一个随机值,使用声音、鼠标点击、键盘计时、温度等生成。下面是相同的代码。
using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider())
{
byte[] rno = new byte[5];
rg.GetBytes(rno);
int randomvalue = BitConverter.ToInt32(rno, 0);
}
要了解操作系统熵,请看我的视频,从14:30开始https://www.youtube.com/watch?v=tCYxc-2-3fY,其中解释了OS熵的逻辑。所以用简单的词RNG Crypto生成SECURE随机数。
推荐文章
- 实体框架核心:在上一个操作完成之前,在此上下文中开始的第二个操作
- 如何为构造函数定制Visual Studio的私有字段生成快捷方式?
- 如何使用JSON确保字符串是有效的JSON。网
- AppSettings从.config文件中获取值
- 通过HttpClient向REST API发布一个空体
- 如何检查IEnumerable是否为空或空?
- 如何在Ruby中生成a和b之间的随机数?
- 自动化invokerrequired代码模式
- 在c#代码中设置WPF文本框的背景颜色
- 在c#中,什么是单子?
- c#和Java中的泛型有什么不同?和模板在c++ ?
- c#线程安全快速(est)计数器
- 如何将此foreach代码转换为Parallel.ForEach?
- 如何分裂()一个分隔字符串到一个列表<字符串>
- 如何转换列表<字符串>列表<int>?