gpt4 book ai didi

C# Mersenne Twister随机整数生成器实现(SFMT)蒙特卡洛模拟

转载 作者:太空狗 更新时间:2023-10-29 19:40:14 39 4
gpt4 key购买 nike

到目前为止,我一直在使用 C# Mersenne Twister在这里找到生成随机数:

http://www.centerspace.net/resources.php

我刚发现 SFMT 这里的速度应该是原来的两倍:

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/

谁能指出 SFMT 的 C# 实现

我的要求是生成一个介于(包括)0 和 2^20 (1048576) 之间的整数。

我需要每天数万亿次进行模拟,以 24 小时时钟运行,因此我准备花几天时间将其调整到完美。

目前,我通过添加一种新方法来满足我的要求,从而调整了 Center Space Mersenne Twister:

public uint Next20()
{
return (uint)(genrand_int32() >> 12);
}

使用方法 genrand_int32() 我想生成我自己的版本,genrand_int20(),生成一个介于(包括)0 和 2 之间的整数^ 20 节省上面的转换和转换,但我不懂数学。我该怎么做?

还有,使用 uint 会比 int 更快,还是仅仅是可寻址数字的问题?因为我最多只需要1048576,所以我只关心速度。

此外,这将在带有 .NET 2 的 Windows Server 2003 R2 SP2(32 位)机器上运行。处理器是 AMD Opteron 275 (4 芯)

最佳答案

您可以下载 source from the link你在 Code Project 上发现的。解压缩它,在 Visual Studio 中加载解决方案并编译它。这将为您提供源代码、一个非托管的 c dll 和一个 .lib 文件。

您可以 P/Invoke 这个 dll 中的函数,(只导出 5 个简单的函数,您只需要其中两个)或者您可以使用这个 dll、lib 和 SFMT 头文件来创建一个托管包装 dll您可以在没有 P/Invoke 的情况下在 C# 中使用。我刚试过这个方法,做起来很简单。没有涉及明确的编码。

方法如下。下载并编译(除了 dll 之外,您还需要创建的 header 和 lib 文件)创建一个新的 C++ CLR 类库项目。称它为 WrapSFMT 或其他名称。转到项目属性。在 C++/预编译 header 下,更改为“不使用预编译 header ”。在 Linker/General/Additional Library Directories 下,输入 SFMT.lib 的路径。在 Linker/Input/Additional Dependencies 下,添加 SFMT.lib。关闭属性页。将 SFMT.h 复制到您的项目文件夹并将其包含在项目中。

编辑WrapSFMT.h 如下:

#pragma once
#include "SFMT.H"

using namespace System;

namespace WrapSFMT {

public ref class SRandom
{
public:SRandom(UInt32);
public:UInt32 Rand32(void);
};
}

这些声明将在您的类中的方法。现在编辑 WrapSFMT.cpp 以阅读:

#include "WrapSFMT.h"

namespace WrapSFMT {

SRandom::SRandom(UInt32 seed)
{
init_gen_rand(seed);
}

UInt32 SRandom::Rand32()
{
return gen_rand32();
}
}

这些实现了您在头文件中声明的方法。您所做的只是从 SFMT.dll 调用函数,C++/CLI 会自动处理从非托管到托管的转换。现在您应该能够构建 WrapSFMT.dll 并在您的 C# 项目中引用它。确保 SFMT.dll 在路径中,你应该没有问题。

关于C# Mersenne Twister随机整数生成器实现(SFMT)蒙特卡洛模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1166408/

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