如何在C#中生成随机整数?


当前回答

我假设你想要一个均匀分布的随机数生成器,如下所示。包括C#和C++在内的大多数编程语言中的随机数在使用之前都没有正确地进行混洗。这意味着你会一次又一次地得到相同的数字,这并不是随机的。为了避免反复绘制相同的数字,您需要一个种子。通常,此任务的时间刻度是正常的。记住,如果你每次使用相同的种子,你会得到相同的数字。所以尽量使用不同的种子。时间是种子的好来源,因为它们总是变化。

int GetRandomNumber(int min, int max)
{
    Random rand = new Random((int)DateTime.Now.Ticks);
    return rand.Next(min, max);
}

如果您正在寻找正态分布的随机数生成器,可以使用Box-Muller变换。检查随机高斯变量问题中yoyoyosef的答案。因为需要整数,所以必须在末尾将双精度值转换为整数。

Random rand = new Random(); //reuse this if you are generating many
double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0-rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
         Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal =
         mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)

随机高斯变量

其他回答

尝试以下简单步骤创建随机数:

创建函数:

private int randomnumber(int min, int max)
{
    Random rnum = new Random();
    return rnum.Next(min, max);
}

在要使用随机数的位置使用上述函数。假设您想在文本框中使用它。

textBox1.Text = randomnumber(0, 999).ToString();

0是最小值,999是最大值。您可以将值更改为任意值。

这是我使用的类。工作方式类似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);
    }
}

我假设你想要一个均匀分布的随机数生成器,如下所示。包括C#和C++在内的大多数编程语言中的随机数在使用之前都没有正确地进行混洗。这意味着你会一次又一次地得到相同的数字,这并不是随机的。为了避免反复绘制相同的数字,您需要一个种子。通常,此任务的时间刻度是正常的。记住,如果你每次使用相同的种子,你会得到相同的数字。所以尽量使用不同的种子。时间是种子的好来源,因为它们总是变化。

int GetRandomNumber(int min, int max)
{
    Random rand = new Random((int)DateTime.Now.Ticks);
    return rand.Next(min, max);
}

如果您正在寻找正态分布的随机数生成器,可以使用Box-Muller变换。检查随机高斯变量问题中yoyoyosef的答案。因为需要整数,所以必须在末尾将双精度值转换为整数。

Random rand = new Random(); //reuse this if you are generating many
double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles
double u2 = 1.0-rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
         Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
double randNormal =
         mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)

随机高斯变量

重复使用Random的一个实例

// Somewhat better code...
Random rng = new Random();
for (int i = 0; i < 100; i++)
{
    Console.WriteLine(GenerateDigit(rng));
}
...
static int GenerateDigit(Random rng)
{
    // Assume there'd be more logic here really
    return rng.Next(10);
}

本文将探讨随机性为何会导致如此多的问题,以及如何解决这些问题。http://csharpindepth.com/Articles/Chapter12/Random.aspx

Random rand = new Random();
int name = rand.Next()

在第二个括号中放入所需的值确保通过编写prop和double tab来设置名称以生成代码