【问题标题】:random.Next() not returning random only returning 0 - C#random.Next() 不返回随机只返回 0 - C#
【发布时间】:2018-11-08 15:42:50
【问题描述】:

我确信这会被标记为重复,但我真的试图弄清楚这一点。这里什么都没有。

我在使用 Head First C# 进行练习时遇到了一个问题。我的问题是我的 Move() 方法中的 random.Next(2) 只会返回 0。这是精简代码:

public class Opponent
    {
        private Location myLocation;
        private Random random;
        public bool Hidden { get; private set; }

        public Opponent(Location startingLocation)
        {
            myLocation = startingLocation;
            random = new Random();
            Hidden = false;
        }

        public void Move()
        {
            var coinFlip = random.Next(2);

            if (myLocation is IHasExteriorDoor)
            {
                if (coinFlip == 1)
                {
                    var myLocationWithDoor = (IHasExteriorDoor)myLocation;
                    myLocation = myLocationWithDoor.DoorLocation;
                }
            }

            myLocation = myLocation.Exits[random.Next(myLocation.Exits.Length)];
            while (!(myLocation is IHidingPlace))
            {
                myLocation = myLocation.Exits[random.Next(myLocation.Exits.Length)];
            }

            Hidden = true;
        }
    }

我尝试移动 random.Next() ,将它直接放在 if 语句中,但这并没有改变任何东西。

我还用书中的代码替换了我的代码,这似乎有效。唯一的问题是我真的看不出有什么区别。这是本书提供的 Move() 方法。

public void Move()
    {
        bool hidden = false;
        while (!hidden)
        {
            if (myLocation is IHasExteriorDoor)
            {
                IHasExteriorDoor locationWithDoor =
                                myLocation as IHasExteriorDoor;
                if (random.Next(2) == 1)
                    myLocation = locationWithDoor.DoorLocation;
            }
            int rand = random.Next(myLocation.Exits.Length);
            myLocation = myLocation.Exits[rand];
            if (myLocation is IHidingPlace)
                hidden = true;
        }
    }

我真的不明白为什么 random.Next() 会给我 1 和 0 而我的不会。

我尝试进行一些谷歌搜索,发现很多人在线程方面存在问题。他们正在创建多个以相同种子结尾的 Random 对象,从而接收相同的随机数。但是,我不认为这就是这里发生的事情。

对这里发生的事情有任何见解吗?这是我的GitHub 的链接,如果有帮助,您可以查看整个项目。

提前感谢您的帮助!

【问题讨论】:

  • random.Next(myLocation.Exits.Length) 也返回 0 吗?
  • @ikerbera 不,这是按预期工作的。这让我更加困惑。
  • 你测试了多少次?尝试做一些测试循环 Move() 方法并记录 coinFlip 值。如果它总是返回 0 或者你运气不好。
  • 只是为了覆盖所有基础......它是否进入if (myLocation is IHasExteriorDoor)?您如何实例化 Opponent,以及如何测试 Move()?你是在某个地方循环调用它吗?
  • 您真的需要为每个Opponent 提供一个单独的Random 实例吗?或者private static Random random = new Random(); 就足够了? -- 如果你在一个紧密的循环中实例化“所有”Opponents,它们都将获得相同的种子值并且它们都将产生相同的“随机”序列。

标签: c# random


【解决方案1】:

真的很抱歉。这很尴尬。我的问题是我的断点在 random.Next(2) 的行上,所以每次我检查它时它总是为零。再次非常抱歉浪费人们的时间并感谢您的建议。

【讨论】:

  • 我们都去过那里。感谢您回来提供您的发现声明。
猜你喜欢
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
相关资源
最近更新 更多