c# 抽象属性中的随机数

c# random numbers in abstract properties

如何创建可以是随机数的摘要属性?

Parent.cs:

public abstract float ageInYears{get;}

Child.cs:

public override float ageInYears{
     get{
          return Random.Range(0, 10);
     }
}

如何确保 Child.cs 将 ageInYears 设置为随机数,并且该随机数在以后访问时保持不变?

每个线程创建 Random 的加密种子实例(受此答案启发:)。

支持 属性 _ageInYears 在每个 Child 的创建过程中被初始化。 public ageInYears 属性 的后续调用将为 Child.

的给定实例return 相同的值
public class Child : Parent
{
    [ThreadStatic]
    private static Random _random;

    private float _ageInYears;
    public override float ageInYears { get { return _ageInYears; } }

    public Child()
    {
        if (_random == null)
        {
            var cryptoResult = new byte[4];
            new RNGCryptoServiceProvider().GetBytes(cryptoResult);

            int seed = BitConverter.ToInt32(cryptoResult, 0);

            _random = new Random(seed);
        }
        _ageInYears = (float)_random.NextDouble() * 10f;
    }
}

https://dotnetfiddle.net/pmM5EC

我使用一种称为托管熵源的方法。只是一个创建随机数的静态 class,然后我在 MES 上调用方法,它是静态的,使所有随机数都来自相同的 'stream',防止 1000+ rng pulls 有时可能只是2 个值。

你也可以制作漂亮的包装器,比如 CoinFlip() 或 Pick(list)

在调试随机事件时有帮助,因为您可以将 MES 实现替换为仅从文件中读取的虚假实现,或者输入框可能是来自用户的数字 ;)

private float? age;
public override float ageInYears{
 get{
      if(!age.HasValue) {
          age = 10.0f * ((float) x.Next()) / ((float) int.MaxValue);
      }
      return age;
 }