gpt4 book ai didi

c# - 如何将函数扩展到 Random 类

转载 作者:行者123 更新时间:2023-11-30 14:01:05 25 4
gpt4 key购买 nike

我正在尝试扩展 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();
}
}

但是我怀疑的是第二个函数ReseedRandomNumberGenerator。我需要许多类可以与 Random 类交互的东西,但所有这些类都应该有相同的实例。

假设我调用了 ReseedRandom...有可能比其他类应该刷新或更新新种子吗?

public class A()
{
protected Random Random = new Random();
}

public class B()
{
protected Random Random = new Random();
}

我知道这行不通。也许我需要一个静态属性,我不确定。

最佳答案

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); }
}
...
}

这里使用 lock 可以防止它在被多线程使用时变得不可预测;虽然到那时您无法保证可重复的订单无论如何,但至少它不会在 Spark 中爆炸。

关于c# - 如何将函数扩展到 Random 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9029716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com