抽象性质中的c#随机数

抽象性质中的c#随机数,c#,random,abstract,C#,Random,Abstract,如何创建可以是随机数的抽象属性 Parent.cs: public abstract float ageInYears{get;} Child.cs: public override float ageInYears{ get{ return Random.Range(0, 10); } } 如何确保Child.cs将ageInYears设置为随机数,并且该随机数在将来访问时保持不变?每个线程都会创建一个加密的random种子实例(受此答案启发:) 备

如何创建可以是随机数的抽象属性

Parent.cs:

public abstract float ageInYears{get;}
Child.cs:

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

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

每个线程都会创建一个加密的
random
种子实例(受此答案启发:)

备份属性
\u ageInYears
在每个
子项的创建过程中初始化。对公共
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;
    }
}

我使用一种称为管理熵源的方法。只是一个创建随机数的静态类,然后我调用MES上的方法,它是静态的,使所有随机数都来自同一个“流”,防止了1000+rng拉力有时只有2个值的问题

您还可以制作精美的包装,如CoinFlip()或Pick(list)


在调试随机事件时提供帮助,因为您可以将MES实现替换为仅从文件读取的伪实现,或者inputbox是用户提供的数字;)

你能再清楚一点你在找什么吗?你只是想将属性初始化为随机数吗?“随机数的停滞”你是什么意思?我不确定你所说的“停滞”是什么意思。您的意思是希望
子对象始终为
ageInYears
返回相同的值吗?听起来您希望属性获得随机初始值,然后保持不变。HimBromBeere说,只需使用您在构造函数中初始化的
私有只读
支持字段,这就是我要找的。你能用这个实现提供一个答案吗?很酷的答案。有没有一种方法可以在支持随机数的子类中实现强制变量,而无需执行整个抽象{get;}和线程处理?我觉得这工作做得太多了。例如,如果我不需要强制执行,我可以在parent.cs中执行
float ageInYears
,在child.cs的主方法中执行
ageInYears=new Random()
。您可以指定“强制”和“未强制”之间的区别吗?您将每个
孩子的
ageInYears
问题编辑为不应更改。我已经更新了代码来反映这一点。这个答案创建了从0到9的整数,表示为浮点数。我想,既然OP使用的是一个浮动,他希望允许一个非离散的年龄value@Steve-我已经更新了答案,将浮点值包含在[0,10]范围内。我喜欢静态类处理随机性的想法。你能提供一个代码示例吗?
private float? age;
public override float ageInYears{
 get{
      if(!age.HasValue) {
          age = 10.0f * ((float) x.Next()) / ((float) int.MaxValue);
      }
      return age;
 }