多个随机数是相同的

Nej*_*man 31 c# random

可能重复:
随机数生成器仅生成一个随机数

一个初学者的问题.我有一个非常简单的程序,它绘制一条线,我想随机化位置,但每次我创建一个新的Random实例时,它返回相同的值.问题出在哪儿?谢谢.

private void Draw()
{
    Random random1 = new Random();
    int randomNumber1 = random1.Next(0, 300);
    Random random2 = new Random();
    int randomNumber2 = random2.Next(0, 300);
    Random random3 = new Random();
    int randomNumber3 = random3.Next(0, 300);
    Random random4 = new Random();
    int randomNumber4 = random4.Next(0, 300);
    System.Drawing.Graphics g = this.CreateGraphics();
    Pen green = new Pen(Color.Green, 5);
    g.DrawLine(green, new Point(randomNumber1, randomNumber2), 
                      new Point(randomNumber3, randomNumber4));
}

private void btndraw1_Click(object sender, EventArgs e)
{
    Draw();
}
Run Code Online (Sandbox Code Playgroud)

Bla*_*hma 58

发生这种情况的原因是,每次执行新操作时Random,都会使用时钟进行初始化.因此,在一个紧密循环(或许多一个接一个的调用)中,您会获得相同的值很多次,因为所有这些随机变量都是使用相同的种子初始化的.

要解决此问题:只创建一个随机变量,最好在函数外部,并仅使用该实例.

Random random1 = new Random();
private void Draw()
{
    int randomNumber1 = random1.Next(0, 300);
    int randomNumber2 = random1.Next(0, 300);
    int randomNumber3 = random1.Next(0, 300);
    int randomNumber4 = random1.Next(0, 300);
    System.Drawing.Graphics g = this.CreateGraphics();
    Pen green = new Pen(Color.Green, 5);
    g.DrawLine(green, new Point(randomNumber1, randomNumber2), new Point(randomNumber3, randomNumber4));
}
Run Code Online (Sandbox Code Playgroud)

  • +1方法以外的方法. (3认同)

Sha*_*ard 10

只需使用相同的实例:

Random random = new Random();
int randomNumber1 = random.Next(0, 300);
int randomNumber2 = random.Next(0, 300);
//...
Run Code Online (Sandbox Code Playgroud)

编程中的随机数并不是随机的; 它们基于一些独特的种子,它被采取和操纵以产生似乎是随机数的集合.使用相同的种子将产生相同的数字集.

Random该类的默认构造函数使用自系统作为种子启动以来经过的毫秒数,因此实际发生的是使用相同的种子.

实际上没有理由创建多个Random实例; 单个实例将在每次执行代码时生成随机数字集.

为了证明我上面的默认种子声明,我使用了反射:

// System.Random
/// <summary>Initializes a new instance of the <see cref="T:System.Random" /> class, using a time-dependent default seed value.</summary>
public Random() : this(Environment.TickCount)
{
}
Run Code Online (Sandbox Code Playgroud)

而且Environment.TickCount:

// System.Environment
/// <summary>Gets the number of milliseconds elapsed since the system started.</summary>
/// <returns>A 32-bit signed integer containing the amount of time in milliseconds that has passed since the last time the computer was started.</returns>
/// <filterpriority>1</filterpriority>
public static extern int TickCount
{
    [SecuritySafeCritical]
    [MethodImpl(MethodImplOptions.InternalCall)]
    get;
}
Run Code Online (Sandbox Code Playgroud)


Adi*_*ter 5

您不应该Random为每个数字创建一个新对象。相反,使用相同的对象:

Random r = new Random();

private void Draw()
{
    // Create 4 random numbers
    int[] numbers = Enumerable.Range(0, 4).Select(x => r.Next(0, 300)).ToArray();

    System.Drawing.Graphics g = this.CreateGraphics();
    Pen green = new Pen(Color.Green, 5);
    g.DrawLine(green, new Point(numbers[0], numbers[1]),
                      new Point(numbers[2], numbers[3]));
}
Run Code Online (Sandbox Code Playgroud)