c#中随机#生成器的问题(已编辑)

本文关键字:问题 编辑 随机 | 更新日期: 2023-09-27 17:49:15

已编辑

我在Main中有这个,我在那里设置对象并调用Player类。很抱歉代码中缺少注释。

        Player MyPlayer;
    MyPlayer = new Player();
    Hiders[] MyHiders = new Hiders[4];

    for (i = 0; i < 4; i++)
    {
        MyHiders[i] = new Hiders();
    }
    while (FoundAll == false)
    {
        MyPlayer.Move();
        for (i = 0; i < 4; i++)
        {
            MyHiders[i].DisplayDistance(MyPlayer.x, MyPlayer.y);
        }
        for (i = 0; i < 4; i++)
        {
            MyHiders[i].CheckCapture(MyPlayer.x, MyPlayer.y);
        }
        FoundAll = true;
        for (i = 0; i < 4; i++)
        {
            if (MyHiders[i].Found == false)
            {
                FoundAll = false;
            }
        }
    }
    Console.WriteLine("You Win!");

这些类别

    class Player
{
    public int x;
    public int y;
    public void Move()
    {
        string buffer;
        Console.WriteLine("Where would you like to move?");
        buffer = Console.ReadLine();
        if (buffer == "u")
        {
            x++;
        }
        if (buffer == "d")
        {
            x--;
        }
        if (buffer == "l")
        {
            y--;
        }
        if (buffer == "r")
        {
            y++;
        }
    }
}
class Hiders
{
    private int x;
    private int y;
    public bool Found;
    int[,] map = new int[10, 10];
    Random MyRandom = new Random();
    int Randomhx;
    int Randomhy;
    public Hiders(int hx, int hy)
    {
        MyRandom = new Random();
        Randomhx = MyRandom.Next(1, 10);
        Randomhy = MyRandom.Next(1, 10);
    }
    public Hiders()
    {
    }
    public void DisplayDistance(int px, int py)
    {
        double distance;
        distance = Math.Sqrt(Math.Pow(x - px, 2) + Math.Pow(y - py, 2));
        Console.WriteLine(distance);
    }
    public void CheckCapture(int px, int py)
    {
        if (Randomhx == px & Randomhy == py)
        {
            Found = true;

        }
    }
}

所有的隐藏者都得到了相同的价值。我如何使它们从1-10变化。这应该是有效的。

c#中随机#生成器的问题(已编辑)

Hiders的每个实例都在实例化自己的Random实例。由于它们几乎同时被实例化,并且Random使用系统时钟作为默认种子,因此Random的所有实例都将产生相同的值序列。我的建议是让Hiders的实例共享一个Random实例。

random的默认构造函数使用系统时间作为种子。尝试将随机与种子一起使用,例如Guid.NewGuid((.GetHashCode((

var rnd = new Random(Guid.NewGuid().GetHashCode());

根据@DeveloperGuo的回答,你应该使用不同的种子,这样你就会得到不同的随机值。这种改变应该奏效。

public Hiders()
{
   MyRandom = new Random( Guid.NewGuid().GetHashCode() );
   x = MyRandom.Next( 1, 10 );
   y = MyRandom.Next( 1, 10 );
}

编辑:

由于我上面的例子实际上不是一个好的练习,这里是另一个镜头:

  public Start_New_Game()
  {
     bool FoundAll = false;
     int i;
     Player MyPlayer;
     MyPlayer = new Player();
     Hiders[] MyHiders = new Hiders[ 4 ];
     HiderGenerator hiderGenerator = new HiderGenerator();
     for ( i = 0 ; i < 4 ; i++ )
     {
        MyHiders[ i ] = hiderGenerator.Get_New_Hider();
     }
     while ( FoundAll == false )
     {
        MyPlayer.Move();
        for ( i = 0 ; i < 4 ; i++ )
        {
           MyHiders[ i ].DisplayDistance( MyPlayer.x, MyPlayer.y );
        }
        for ( i = 0 ; i < 4 ; i++ )
        {
           MyHiders[ i ].CheckCapture( MyPlayer.x, MyPlayer.y );
        }
        FoundAll = true;
        for ( i = 0 ; i < 4 ; i++ )
        {
           if ( MyHiders[ i ].Found == false )
           {
              FoundAll = false;
           }
        }
     }
     Console.WriteLine( "You Win!" );
  }
  class Player
  {
     public int x;
     public int y;
     public void Move()
     {
        string buffer;
        Console.WriteLine( "Where would you like to move?" );
        buffer = Console.ReadLine();
        if ( buffer == "u" )
        {
           x++;
        }
        if ( buffer == "d" )
        {
           x--;
        }
        if ( buffer == "l" )
        {
           y--;
        }
        if ( buffer == "r" )
        {
           y++;
        }
     }
  }
  class HiderGenerator
  { 
     Random MyRandom = new Random();
     public Hiders Get_New_Hider()
     {
        return new Hiders( MyRandom.Next(1,10), MyRandom.Next(1,10) );
     }
  }
  class Hiders
  {
     private int x;
     private int y;
     public bool Found;
     int[,] map = new int[ 10, 10 ];
     public Hiders( int x, int y )
     {
        this.x = x;
        this.y = y;
     }
     public void DisplayDistance( int px, int py )
     {
        if ( Found )
           return;
        double distance;
        distance = Math.Sqrt( Math.Pow( x - px, 2 ) + Math.Pow( y - py, 2 ) );
        Console.WriteLine( distance );
     }
     public void CheckCapture( int px, int py )
     {
        if ( Found )
           return;
        if ( x == px && y == py )
        {
           Found = true;
        }
     }
  }

这不是一个完美的答案,但至少它可以成为一个起点。