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;
}
}
我使用一种称为托管熵源的方法。只是一个创建随机数的静态 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;
}
如何创建可以是随机数的摘要属性?
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
.
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;
}
}
我使用一种称为托管熵源的方法。只是一个创建随机数的静态 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;
}