我想要的只是C#中的 实用 随机数生成器,所以我可以说例如
int dummyAge = MathHelpers.GetRandomNumber(20,70);
并且看起来像准随机,例如生成虚拟数据。
大多数stack overflow questions on this topic并在网络上进行关于真正随机性的哲学讨论,这不是我目前感兴趣的,例如很久以前我在 PHP 中做过一次,使用毫秒/睡眠这对虚拟数据来说很好,我只是想在 C#quick 。
有没有人根据一些时间种子等有一个快速的一半体面的C#随机数生成器,或者,我怎么能改变以下代码,以便它总是不生成相同的5连续数?
using System;
namespace TestRandom23874
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
Console.WriteLine("the random number is: {0}", MathHelpers.GetRandomNumber(1, 10));
Console.ReadLine();
}
}
public class MathHelpers
{
public static int GetRandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}
}
}
答案 0 :(得分:13)
public class MathHelpers
{
private static Random random = new Random();
public static int GetRandomNumber(int min, int max)
{
return random.Next(min, max);
}
}
这样,你不是每次都创建一个新的Random对象,而是重复使用同一个对象。当您足够快地重新创建一个新的时,它们将产生相同的结果。但是,如果您重复使用现有的,您将获得随机性。
答案 1 :(得分:2)
BFree的答案很好,但我认为值得一提的是一个稍微不同的模式 - 将Random
实例传递给任何需要它的东西,而不是总是通过静态变量使用单个实例。后一种方法的缺点是Random
不是线程安全的。您需要一些锁定或线程局部变量,或者避免使用多个线程开始。所以我会将问题中的原始代码调整为:
using System;
namespace TestRandom23874
{
class Program
{
static void Main(string[] args)
{
Random rng = new Random();
Console.WriteLine("the random number is: {0}",
MathHelpers.GetRandomNumber(rng, 1, 10));
Console.WriteLine("the random number is: {0}",
MathHelpers.GetRandomNumber(rng, 1, 10));
Console.WriteLine("the random number is: {0}",
MathHelpers.GetRandomNumber(rng, 1, 10));
Console.WriteLine("the random number is: {0}",
MathHelpers.GetRandomNumber(rng, 1, 10));
Console.WriteLine("the random number is: {0}",
MathHelpers.GetRandomNumber(rng, 1, 10));
}
}
public class MathHelpers
{
public static int GetRandomNumber(Random random, int min, int max)
{
return random.Next(min, max);
}
}
}
这只是控制的基本反转,真的。您可能有一个静态RNG并且围绕它进行锁定,用于在您需要时以线程安全的方式生成Random
的新实例(通过随机生成种子然后使用该实例)创建实例)然后在整个特定的单线程操作集中重用Random
。
答案 2 :(得分:1)
问题(5个相同的数字)是一个计时问题,BFree的答案解决了它。 Random类是使用计时器进行自播种,你的调用非常接近它们使用相同的种子。