xoshiro256 随机数生成器 - MetaTrader 5 库

xoshiro256**(以其操作命名:异或,转移,旋转)是由 Sebastiano Vigna 与 David Blackman 合作设计的伪随机数生成器 https://prng.di.unimi.it/
这是一款 64 位通用、坚如磐石的生成器。它具有出色的(亚纳秒)速度、对于任何并行应用程序来说都足够大的状态大小(256 位),并且它通过了所有已知的统计测试。
xoshiro256** 算法不适合加密目的,但速度非常快并且具有出色的统计特性。
它目前用于 Microsoft 的 .NET 框架以及 Chrome、Node.js、Firefox、Safari 和 Microsoft Edge 的 JavaScript 引擎。
这里使用的算法翻译自 https://prng.di.unimi.it/xoshiro256starstar.c 参考 David Blackman 和 Sebastiano Vigna 的源代码。
对于 MetaTrader 程序员和交易者来说,这与以下方面高度相关:
蒙特卡罗模拟:准确模拟价格变动、期权定价或其他随机过程。
回测和策略优化:生成随机数据或事件来测试交易策略在各种市场条件下的稳健性。
指标和智能交易系统 (EA) 开发:为使用随机逻辑的 EA 提供可靠的随机源,例如用于优化的遗传算法。
研究与分析:RandomDoubleHighRes 方法对于需要更高精度模拟和模型的研究人员和定量分析师特别有用,可确保比标准结果更准确、更可靠数学兰德()。
该类为随机数生成提供了一个简单的接口。
//+------------------------------------------------------------------+ //| Xoshiro256 类 | //|用法:提供 Xoshiro256** 算法的实现。 | //+------------------------------------------------------------------+ 班级小四郎256 {民众: // 构造函数和析构函数 西四郎256(空白); // 自动种子构造函数 〜Xoshiro256(空白) { } // 设置生成器的内部状态 空白 种子(乌龙种子); 空白 种子(乌龙一个,乌龙乙、乌龙c、乌龙d); // 生成随机数的公共方法 整数 随机整数(空白); // 随机整数 [0, INT_MAX] 整数 随机整数(常量 整数最大限度); // 随机整数 [0, max) 整数 随机整数(常量 整数分钟,常量 整数最大限度); // 随机整数 [最小值, 最大值) 长的 随机长(空白); // 随机长型 [0, LONG_MAX] 长的 随机长(常量 长的最大限度); // 随机长[0, max) 长的 随机长(常量 长的分钟,常量 长的最大限度); // 随机长[最小值,最大值) 双倍的 随机双精度(空白); // 随机双精度 [0.0, 1.0) 双倍的 随机双精度(常量 双倍的最大限度); // 随机双精度 [0.0, max) 双倍的 随机双精度(常量 双倍的分钟,常量 双倍的最大限度); // 随机双精度 [最小值, 最大值) 双倍的 随机双高分辨率(空白); // 随机双精度 [0.0, 1.0) 双倍的 随机双高分辨率(常量 双倍的最大限度); // 随机双精度 [0.0, max) 双倍的 随机双高分辨率(常量 双倍的分钟,常量 双倍的最大限度);// 随机双精度 [最小值, 最大值) 布尔值 随机布尔值(空白); // 随机真/假(等概率) 布尔值 随机布尔值(常量 双倍的概率真); // 随机真/假(使用 prob_true) 双倍的 随机正态(空白); // 随机双精度(平均值为 0,标准差为 1 的正态分布) 双倍的 随机正态(常量 双倍的亩,常量 双倍的西格玛); // 随机双精度(正态分布) // 采样实用程序 模板<类型名> 空白 随机播放(T &arr[]); // 使用 Fisher-Yates 将数组 arr[] 打乱 模板<类型名> 布尔值 样本(常量T &arr[], T &dest[],整数k); // 从 arr[] 中采样 k 个唯一项而不进行替换 模板<类型名> 布尔值 替换样本(常量T &arr[], T &dest[],整数k); };
如果您正在进行大量蒙特卡罗模拟,那么这个 xoshiro256** 生成器将比 MQL 的 MathRand() 更快、更准确:
//+------------------------------------------------------------------+ //| speed_benchmark.mq5 | //| 版权所有 © 2018,阿姆·阿里 | //| https://www.mql5.com/en/users/amrali | //+------------------------------------------------------------------+ #包括“Xoshiro256.mqh” //--- 随机数生成器对象Xoshiro256 prng;#定义国际热核实验堆(500*1000*1000) // 5 亿 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 空白 启动时() {//--- MathRand() 基准测试。 单位t1=获取刻度数(); 为了(整数我=0;我<国际热核聚变实验堆;我++) { 数学兰德(); } 单位刻度1 =获取刻度数() - t1;//--- Xoshiro256 基准测试。 单位t2=获取刻度数(); 为了(整数我=0;我<国际热核聚变实验堆;我++) { prng.RandomInteger(); } 单位刻度2 =获取刻度数()-t2;//--- 显示结果。 打印格式(“生成 %d 个随机整数:”,国际热核聚变实验堆); 打印格式(“MathRand() -> %u 毫秒”, 刻度1); 打印格式(“Xoshiro256 -> %u 毫秒”, 刻度2); 打印格式(“加速系数为 %.1fx”, (双倍的) 刻度 1/刻度 2); }//+------------------------------------------------------------------+ // 示例输出: /* 生成 500000000 个随机整数: MathRand() -> 968 毫秒 Xoshiro256 -> 422 毫秒 加速系数为 2.3 倍 */
更新:
2023.01.06 - v.1.01:
2025.08.01 - v.1.02:
2025.08.03 - v.1.03:
2025.08.28 - v.1.05
2025.09.13 - v.1.06
2025.09.19 - v.1.08
2025.10.02 - v.1.09
由 xoshiro256** 随机数生成器生成的位图
该代码也反映在 Algo Forge 上: https://forge.mql5.io/amrali/Xoshiro256
附件下载
📎 Xoshiro256.mqh (43.44 KB)
📎 demo_examples.mq5 (7.19 KB)
📎 speed_benchmark.mq5 (3.07 KB)
Source: MQL5 #42098
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
