c # случайные числа в абстрактных свойствах - PullRequest
0 голосов
/ 29 июня 2018

Как создать абстрактное свойство, которое может быть случайным числом?

Parent.cs:

public abstract float ageInYears{get;}

Child.cs:

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

Как я могу убедиться, что Child.cs устанавливает ageInYears в случайное число и что это случайное число остается неизменным при каждом обращении в будущем?

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Я использую метод, который я называю управляемым источником энтропии. Просто статический класс, который создает Random, затем я вызываю методы в MES, который является статическим, заставляет все случайные числа поступать из одного и того же «потока», предотвращая проблему, когда 1000+ rng тяг может иногда иметь только 2 значения.

Также вы можете сделать хорошие обертки, такие как CoinFlip () или Pick (список)

Помогает при отладке случайных событий, так как вы можете поменять свою реализацию MES на поддельную, которая просто читает из файла, или, возможно, в поле ввода указан номер пользователя;)

0 голосов
/ 30 июня 2018
private float? age;
public override float ageInYears{
 get{
      if(!age.HasValue) {
          age = 10.0f * ((float) x.Next()) / ((float) int.MaxValue);
      }
      return age;
 }
0 голосов
/ 29 июня 2018

Криптографически заполненный экземпляр Random создается для потока (на основе этого ответа: https://stackoverflow.com/a/12952155/315689).

Свойство поддержки _ageInYears инициализируется при создании каждого Child. Последующие обращения к общедоступному свойству ageInYears вернут то же значение для данного экземпляра Child.

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

...