0

嗨,我在徘徊我如何实现休闲:我希望将一个项目多次编译为几个 dll,并通过使用来自其他项目的它们来获得不同的结果。它背后的想法是调试反射应用程序。这是我的代码:

public class MokingDataSouce : IDataSource
{
    public MokingDataSouce()
    {
        Random random = new Random();
        this.MokingId = random.Next(1, 11);
    }

    public string Name
    {
        get { return "Moking Data Source " + this.MokingId; }
    }

    public int MokingId { get; set; }

    public IDocumentDetails DocumentDetails
    {
        set { }
    }
 }

我多次编译这段代码并重命名 dll 期望得到不同的结果。当我运行一个加载 dll 并启动 MokingDataSource 的程序时,我得到了所有相同的 MokingId。

PS我尝试将随机设置为静态成员,但我得到了相同的结果。

我认为这与所有存在于同一个运行时 CLI 中的事实有关。但我找不到克服它的方法。

谢谢

4

1 回答 1

2

随机是确定性的。它是一种为较早的给定值(“种子”)生成数字的算法。

您可以使用种子值初始化 Random 以获得相同的结果:

var rand = new Random(13);

当您不指定种子值时,将使用基于时间的值。

您可能一个接一个地调用相同的方法,这就是为什么它们使用相同的基于时间的种子值,从而产生相同的随机值。

如果你想使用某个特定编译版本的程序集唯一的值,请查看程序集的 moduleversionid,该值是为每个编译唯一生成的:

Assembly.GetExecutingAssembly().ManifestModule.ModuleVersionId

您可以执行以下操作:

var rand = new Random(
    Assembly.GetExecutingAssembly().ManifestModule.ModuleVersionId.GetHashCode()
    );

让您的模块生成相同的随机数,但为每次编译生成不同的随机数。

于 2013-05-26T22:06:47.717 回答