【问题标题】:Problems with random # generators in c# (EDITED)c# 中随机 # 生成器的问题(已编辑)
【发布时间】:2014-03-10 02:23:59
【问题描述】:

已编辑

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

        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改变。这应该可以工作。

【问题讨论】:

  • 你是说 Hiders 类的 DisplayDistance 方法吗?如果是这种情况,您已经使用 MyHiders[i].DisplayDistance(MyPlayer.x, MyPlayer.y); 调用它
  • 好的,现在我明白了。有一些放错地方的东西使它显示距离之前说左/右上/下
  • 我对其进行了编辑,并更改了问题。所有的隐藏者都出现了相同的值。我如何改变他们在网格上的位置?
  • 即使你设法使随机工作,你仍然会得到 x 和 y 的零(在 Hiders 类中),因为你从未初始化它们。
  • 如何初始化它们 mbm?

标签: c# class oop c#-4.0 object


【解决方案1】:

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

【讨论】:

  • Hiders类中使用静态字段而不是当前实例字段,并在构造函数中删除不必要的new Random()
【解决方案2】:

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

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

【讨论】:

  • 我不知道那是什么。我该如何设置?
  • 我用MyRandom = new Random();替换它吗?
  • 是 - 将默认构造函数的所有使用替换为具有种子重载的构造函数。
  • 那行不通。我认为我需要以某种方式将class Hiders 开头的private int xprivate int y 设置为RandomhxRandomhy。我该怎么做呢?我已经尝试了几个小时。
  • public Hiders(int hx, int hy) { var MyRandom = new Random(Guid.NewGuid().GetHashCode()); x = Randomhx = MyRandom.Next(1, 10); y = Randomhy = MyRandom.Next(1, 10); }
【解决方案3】:

根据@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;
        }
     }
  }

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

【讨论】:

  • 这行得通,但是现在当我进入一个隐藏器(距离 = 0)时,它不会将其从显示距离中取出,也不会将其视为已找到
  • @user3158491 因为您在 CheckCapture 方法中与 Randomx & Randomy 而不是 x & y 进行比较
  • 在 CheckCapture 中,我将 Randomhx 和 Randomhy 更改为 x 和 y,但效果相同。
猜你喜欢
  • 2017-04-10
  • 2013-10-21
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2016-05-26
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多