抽象性质中的c#随机数
如何创建可以是随机数的抽象属性 Parent.cs:抽象性质中的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种子实例(受此答案启发:) 备
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;
}