Dar*_*Zon 3 c# random extension-methods static random-seed
我正在尝试从 Random 类扩展函数。
public static class RandomExtensions
{
public static void NextEven(this Random rnd, int min, int max)
{
// ...
}
public static void ReseedRandomNumberGenerator(this Random rnd, int? seed = null)
{
rnd = seed.HasValue ? new Random(seed.Value) : new Random();
}
}
Run Code Online (Sandbox Code Playgroud)
但我怀疑的是第二个函数 ReseedRandomNumberGenerator。我需要许多类可以与 Random 类交互的东西,但所有这些类都应该具有相同的实例。
假设我调用 ReseedRandom ......它可能比其他类应该刷新或更新新种子?
public class A()
{
protected Random Random = new Random();
}
public class B()
{
protected Random Random = new Random();
}
Run Code Online (Sandbox Code Playgroud)
我知道这行不通。也许我需要一个静态属性,我不确定。
该this参数是 by-val,意思是:调用者不会注意到您对该值所做的任何重新分配,因此您的Reseed...方法不会执行调用者会注意到的任何事情。要做到这一点,听起来你想要在某个地方有一个静态实例,但是你也需要注意线程安全之类的事情。
就个人而言,我会创建一个单独的 API,例如:
public static class MyRandom {
static Random random = new Random();
static readonly object sync = new object();
public static void Seed(int seed) {
lock(sync) { random = new Random(seed); }
}
public static int Next() {
lock(sync) { return random.Next(); }
}
public static int Next(int max) {
lock(sync) { return random.Next(max); }
}
...
}
Run Code Online (Sandbox Code Playgroud)
lock当被多线程使用时,here的使用可以防止它变得不可预测;虽然在这一点上你不能保证可重复的顺序反正,但至少它不会产生火花引起爆炸。