方法在对象创建期间仅运行一次

邦德拉

知名会员
已加入
2020年10月24日
留言内容
62
编程经验
Beginner
由于某种原因,我无法弄清楚,我的静态方法ShuffleProbability()在对象创建期间仅运行一次。
我希望对于每个对象创建,它将进入ShuffleProbability方法并生成false / true并将属性IsHungry设置为返回值?

C#:
        public void CreateDummyAnimals()
        {
            //Create dummy animals at start

            Petowner.Pets.Add(new Cat
            {
                Name = "Missy",
                IsHungry = ShuffleProbability(),
            });
            Petowner.Pets.Add(new Dog
            {
                Name = "Bruno",
                IsHungry = ShuffleProbability(),
            });          
        }

ShuffleProbability方法:
        public static bool ShuffleProbability()
        {
            // Shuffles a bool value with 50% probaility
            随机 random = new 随机();

            bool randomNumber = random.Next(0, 2) > 0;
            return randomNumber;
        }
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,465
位置
弗吉尼亚州切萨皮克
编程经验
10+
If you set a breakpoint on ShuffleProbability(), you will actually find that it is called twice.

The problem is that you are instantiating two 随机 objects in close proximity in time. The two objects end up having the same random seed number so both of them will generate the same sequence of random numbers. You should only create one instance of a 随机 object 和 use it for all your cases when you need to generate a random sequence of numbers.

有关更多详细信息,请参见 文件资料.

要产生不同的随机数序列,您可以使种子值与时间相关,从而对每个新的实例产生不同的序列。 随机。参数化 随机(Int32) 构造函数可以 Int32 值基于当前时间的刻度数,而无参数 随机() 构造函数使用系统时钟生成其种子值。但是,仅在.NET Framework上,因为时钟具有有限的分辨率,所以使用无参数构造函数来创建不同的 随机 紧密相邻的对象创建随机数生成器,生成相同的随机数序列。以下示例说明了两个 随机 在.NET Framework应用程序中紧密实例化的对象会生成相同的随机数序列。在大多数Windows系统上, 随机 彼此之间在15毫秒内创建的对象可能具有相同的种子值。
 

邦德拉

知名会员
已加入
2020年10月24日
留言内容
62
编程经验
Beginner
谢谢!您是说我应该在将使用ShuffleProbability()的每种方法中实例化它吗?还是在下面的课程中?

C#:
// Did not work
class Petowner
{
    Utility utility = new Utility();
}

// Works
class Petowner
{
    public static void AddAnimals(){
        Utility utility = new Utility();
    }
}
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,465
位置
弗吉尼亚州切萨皮克
编程经验
10+
更像:
C#:
class 什么everClassContainsTheThingThatNeedsRandom
{
    static 随机 _random = new 随机();

    :

    public static bool 随机TrueOrFalse()
        => _random.Next(0, 2) > 0;

    :
}
 
Last edited:
最佳 底部