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

2024-01-19

到目前为止我一直在使用C#梅森扭转者 http://en.wikipedia.org/wiki/Mersenne_twister在这里找到生成随机数:

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

我刚刚发现SFMT http://en.wikipedia.org/wiki/Mersenne_twister#SFMT这里的速度应该是两倍:

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/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 皓龙 275 http://en.wikipedia.org/wiki/List_of_AMD_Opteron_microprocessors#Opteron_200-series_.22Italy.22_.28E6.2C_90_nm.29(4核).


你能做的就是下载来源来自链接 http://www.codeproject.com/KB/DLL/SFMT_dll.aspx?msg=3130186您在 Code Project 上发现的。解压缩它,在 Visual Studio 中加载解决方案并编译它。这将为您提供源代码、非托管 c dll 和 .lib 文件。

您可以 P/Invoke 此 dll 中的函数(仅导出 5 个简单函数,您只需要其中两个)或者您可以使用此 dll、lib 和 SFMT 头文件来创建您可以使用的托管包装器 dll在没有 P/Invoke 的 C# 中。我刚刚尝试了这个方法,而且做起来非常简单。没有涉及明确的编组。

就是这样。下载并编译后source(除了 dll 之外,您还需要创建的头文件和 lib 文件)创建一个新的 C++ CLR 类库项目。称之为 WrapSFMT 或其他名称。转到项目属性。在 C++/预编译头下,更改为“不使用预编译头”。在链接器/常规/附加库目录下,输入 SFMT.lib 的路径。在链接器/输入/附加依赖项下,添加 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 在路径中,应该不会有任何问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# Mersenne Twister 随机整数生成器实现(SFMT)蒙特卡罗模拟 的相关文章

  • 在 C# 中使用“using”关键字避免多次处置的最佳实践

    当变量是 IDisposable 时 我们有using关键字来管理处置 但是如果我们在方法中返回值怎么办 using twice StringContent stringToStringContent string str using St
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • 如何使用 ASP.NET MVC 编辑多选列表?

    我想编辑一个如下所示的对象 我希望用 UsersGrossList 中的一个或多个用户填充 UsersSelectedList 使用 mvc 中的标准编辑视图 我只得到映射的字符串和布尔值 下面未显示 我在 google 上找到的许多示例都
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • Java给定长度的随机数

    我需要在 Java 中生成一个恰好 6 位数字的随机数 我知道我可以在随机发生器上循环 6 次 但是在标准 Java SE 中还有其他方法可以做到这一点吗 要生成 6 位数字 Use Random http download oracle
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐