如何在C#中生成随机整数?
当前回答
除了COBOL答案,我已经尝试了所有这些解决方案。。。英雄联盟
这些解决方案都不够好。我需要一个快速的for int循环中的随机数,即使在很宽的范围内,我也得到了大量的重复值。在接受了太长时间的随机结果之后,我决定最终彻底解决这个问题。
这都是关于种子的。
我通过解析Guid中的非数字来创建一个随机整数,然后使用它来实例化random类。
public int GenerateRandom(int min, int max)
{
var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value);
return new Random(seed).Next(min, max);
}
更新:如果实例化Random类一次,则无需种子化。所以最好创建一个静态类并调用一个方法。
public static class IntUtil
{
private static Random random;
private static void Init()
{
if (random == null) random = new Random();
}
public static int Random(int min, int max)
{
Init();
return random.Next(min, max);
}
}
然后您可以像这样使用静态类。。
for(var i = 0; i < 1000; i++)
{
int randomNumber = IntUtil.Random(1,100);
Console.WriteLine(randomNumber);
}
我承认我更喜欢这种方法。
其他回答
创建随机对象
Random rand = new Random();
并使用它
int randomNumber = rand.Next(min, max);
你不必每次需要一个随机数时都初始化新的Random(),先初始化一个Random,然后在循环中使用它,或者其他
这个问题看起来很简单,但答案有点复杂。如果你看到几乎所有人都建议使用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随机数。
快速方便的内联,使用以下代码:
new Random().Next(min, max);
// for example unique name
strName += "_" + new Random().Next(100, 999);
我想演示每次使用新的随机生成器时会发生什么。假设您有两个方法或两个类,每个都需要一个随机数。你天真地把它们编码成:
public class A
{
public A()
{
var rnd=new Random();
ID=rnd.Next();
}
public int ID { get; private set; }
}
public class B
{
public B()
{
var rnd=new Random();
ID=rnd.Next();
}
public int ID { get; private set; }
}
你认为你会得到两个不同的身份证吗?不
class Program
{
static void Main(string[] args)
{
A a=new A();
B b=new B();
int ida=a.ID, idb=b.ID;
// ida = 1452879101
// idb = 1452879101
}
}
解决方案是始终使用单个静态随机生成器。这样地:
public static class Utils
{
public static readonly Random random=new Random();
}
public class A
{
public A()
{
ID=Utils.random.Next();
}
public int ID { get; private set; }
}
public class B
{
public B()
{
ID=Utils.random.Next();
}
public int ID { get; private set; }
}
Random r = new Random();
int n = r.Next();
推荐文章
- HTTP POST返回错误:417“期望失败。”
- 如何在。net中创建和使用资源
- 为什么Path。以Path.DirectorySeparatorChar开头的文件名合并不正确?
- 如何在c#中获得正确的时间戳
- Linq选择列表中存在的对象(A,B,C)
- c# .NET中的App.config是什么?如何使用它?
- c#:如何获得一个字符串的第一个字符?
- String类中的什么方法只返回前N个字符?
- 更好的方法将对象转换为int类型
- 我可以将c#字符串值转换为转义字符串文字吗?
- 在c#中转换char到int
- c#中朋友的对等物是什么?
- 关键字使用virtual+override vs. new
- 在ASP中选择Tag Helper。NET Core MVC
- 如何在没有任何错误或警告的情况下找到构建失败的原因