- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
到目前为止,我一直在使用 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/
Boost 提供 mt19937 和 mt19937_64 http://www.boost.org/doc/libs/1_55_0/doc/html/boost_random/reference.h
我有一小段代码可以运行 Mersenne Twister PRNG,效果很好: std::random_device randDev; std::mt19937 twister(randDev());
所以我有一个使用 Mersenne Twister 的自定义随机发生器类(我使用的代码改编自 this site)。一切似乎都运行良好,直到我开始测试不同的种子(我通常使用 42 作为种子,以确保每次
我正在将一个大型科学模拟软件迁移到 C++。在 Java 中我使用了 Cern Colt library它包括一个完整的随机分布列表。 当需要不同的发行版(例如提供的链接中列出的发行版)时,通常使用什
我读到“梅森扭曲器的计算复杂度为 O(p2),其中 p 是多项式的次数”。 这是什么意思? 这是指哪个多项式? 此外,计算复杂度是时间复杂度的另一种表述方式,还是与算法运行所需的空间量有关? 最佳答案
我有点不确定这个问题的正确论坛。它介于理论比较之间。科学/数学和编程。 我使用 Mersenne-Twister 生成伪随机数。现在,从给定的种子开始,我想跳到序列中的第 n 个数字。 我看过这个:h
这个问题在这里已经有了答案: stl random distributions and portability (1 个回答) 关闭 8 年前。 我正在使用 std::mt19937_64 生成随机
我的构造函数有什么问题?每次我调用一个应该生成随机数的函数(大约每五秒一次)时,它都会生成相同的数字。每个调用实例化下面这些对象之一。我以为我是用 m_rd 的 operator() 调用的输出随机播
我想知道如何将梅森随机数生成器保留为成员变量并在同一个类中使用它。 我编写了如下类,它运行良好,但我不喜欢 std::mt19937 被初始化。我想知道有没有办法在Test的构造函数中初始化它? #i
我有一个很简单的问题:当我们使用 Mersenne Twister -19937 生成器并修复种子时,每次调用生成器时,它都会生成具有某些特征(独立性、均匀分布)的数字序列。这里重要的是独立性(或 2
众所周知,可以反转 MT 回火功能。可在线获取源代码来执行此操作 here .我试图弄清楚这是如何工作的,以及我将如何以编程方式解决这个问题和类似的问题。 我正在努力解决的是,对有限大小的变量进行移位
我读到 Mersenne Twister 生成器的周期为 2¹⁹⁹³⁷ - 1,但我很困惑为什么会这样。我看到 this implementation Mersenne Twister 算法,在第一条
我尝试使用 32 位种子实现跨平台一致的随机数生成。大多数帖子都指向我Mersenne Twister或者编写我自己的实现。 在 source code有一个名为 void init_by_array
我想生成 1000 个不同的 k 值并计算 k 的均值和方差,但是当我使用 MT 时,它在电子表格中始终是相同的数字。以下是我的代码,希望有人能帮助我。非常感谢! int main(int argc,
我最近在使用 Mersenne-Twister 算法在 C++ 中生成随机数时遇到了一个问题。当遍历for循环并使用cout输出生成的数字时,它会重复输出相同的数字。例如,它输出类似 11 11 11
我想找出我可以用 C++ 为随机数生成器播种的最大值。我的代码如下: mt19937 myRandomGenerator(seed); 变量 seed 可以有多大?我注意到,如果该值变得太大,随机数生
我正在使用 Mersenne Twister 生成具有 1D 柏林噪声的 2D 地形以获取随机数。我的第一个想法是使用 Mersenne Twister 在任何给定的硬件上使用相同的种子总是给我相同的
我编写了一个包含不同算法的 RNG 类,但它没有按预期工作。除了我想使用正常(而不是均匀)分布这一事实之外,我的代码总是返回相同的数字(最大值)或仅返回区间 [min,max] 中的 2 个数字: s
我想使用 mt19937 遍历一个数组并从中获取每个值一次,但顺序是随机的。本质上,有没有一种方法可以使用 mt19937 仅生成一次特定范围内的所有数字(不只是忽略重复项,而是确保它不会完全产生重复
我正在我的应用程序中调整 Mersenne Twister,特别是来自 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937a
我是一名优秀的程序员,十分优秀!