问题:

在计算旅行商问题中的欧几里得距离时,我试图使用 3-opt 算法来交换某些节点;因为大多情况下我有大约超过500个节点,我需要随机地选择至少1/3的节点进行交换。

所以我需要一个快速产生随机数的函数(标准函数rand()太慢了)。不需要多么巧妙,差不多就行了。

注:忘了说,我无法使用除了标准库(比如 STL,iostream 等)以外的库,所以 boost 库也不行。

AndyV 的最佳答案:

其他人的答案提到了 Marsaglia 的 Xorshift 算法(https://en.wikipedia.org/wiki/Xorshift),但是没人贴代码。

static unsigned long x=123456789, y=362436069, z=521288629;

unsigned long xorshf96(void) { //period 2^96-1

unsigned long t;

x ^= x << 16;

x ^= x >> 5;

x ^= x << 1;

t = x;

x = y;

y = z;

z = t ^ x ^ y;

return z;

}

这段代码几乎在任何地方都适用;然而当我试图产生随机的二进制矩阵时,它却失败了。大概是 95×95 的矩阵,它生成了太多或太少的奇异矩阵(我忘了具体是多还是少了)。这个随机数生成器相当于一个线性反馈移位寄存器。不过如果你要做加密或者蒙特卡洛的相关工作,这个生成器就不能用了。

补充:Xorshift 算法介绍

Xorshift 随机数生成器是 George Marsaglia 发明的一类伪随机数生成器。它们通过和自己逻辑移位后的数进行异或操作来生成序列中的下一个数。这在现代计算机体系结构非常快。它们是线性反馈移位寄存器的一个子类,其简单的实现使它们速度更快且使用更少的空间。然而,必须仔细选择合适参数以达到长周期。

Xorshift生成器是非密码安全的随机数生成器中最快的一种,只需要非常短的代码和状态。虽然它们没有进一步改进以通过统计检验,这个缺点非常著名且容易修改(Marsaglia 在原来的论文中指出),用复合一个非线性函数的方式,可以得到比如像 xorshift+ 或 xorshift* 生成器。一个简单的C语言实现的 xorshift+ 生成器通过了所有的 BigCrush 的测试(比 Mersenne Twister 算法和 WELL 算法的失败次数减少了一个数量级),而且在 x86 上产生一个随机数通常只需要不到十个时钟周期,多亏了指令流水线。

因为一般的 xorshift 生成器(没有非线性这一步)在一些统计测试中失败了,所以经常被指责是不可靠的。

示例实现

一个 xorshift 生成器的 C/C++ 版本实现:

#include

/* These state variables must be initialized so that they are not all zero. */

uint32_t x, y, z, w;

uint32_t xorshift128(void) {

uint32_t t = x ^ (x << 11);

x = y; y = z; z = w;

return w = w ^ (w >> 19) ^ t ^ (t >> 8);

}

这个算法有一个最大的周期2128 − 1 ,且通过了 diehard 测试。不过,它在 TestU01 框架的 BigCrush 测试套件中的 MatrixRank 和 LinearComp 测试中失败了。

c++语言生成一个随机数,C++ 快速随机数生成器相关推荐

  1. c++语言生成一个随机数,C/C++怎么生成“真正的”随机数

    C/C++怎么生成"真正的"随机数 C语言中,直接用rand()函数生成随机数的话,会出现一个尴尬的局面,那就是每次运行都会生成相同的一个数,这显然不能满足我们的期望.怎么回事呢? ...

  2. c++产生均匀分布随机数赋值_不随机的随机数:高斯随机数生成器综述

    随机数的使用非常广泛,例如在从统计总体中抽取有代表性的样本时,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡洛模拟法计算的时候等等.事实上,这些统计技术中使用的随机数均为"伪随 ...

  3. python从random生成列表_详解Python利用random生成一个列表内的随机数

    详解Python利用random生成一个列表内的随机数 首先,需要导入random模块: import random 随机取1-33之间的1个随机数,可能重复: random.choice(range ...

  4. 初识JAVA:猜数字小游戏案例---系统产生一个1-100之间的随机数,猜出这个数是多少?

    package com.pku.wuyu.io; import java.util.IllegalFormatCodePointException; import java.util.Random; ...

  5. java 键盘录入猜数,生成一个1-100之间的随机数,用户键盘录入猜数字

    猜数字案例的需求如下: 后台预先生成一个1-100之间的随机数,用户键盘录入猜数字 如果猜对了,打印"恭喜您,答对了" 如果猜错了 猜大了:打印"sorry,您猜大了!& ...

  6. 产生一个1--10之间的随机数,用户去猜这个数,直到猜中为止

    import java.util.Scanner; import java.util.Random; class Demo4  { public static void main(String[] a ...

  7. java 生成随机数_Java 生成随机数的 N 种方法

    原标题:Java 生成随机数的 N 种方法 www.baeldung.com/java-generating-random-numbers 1.引言 本文将探讨用 Java 生成随机数的不同方法. 2 ...

  8. 随机数计算html,随机数的产生方法 电脑随机数产生的计算具体方法

    要产生随机数,可以使用Java api中java.lang包中的Math类.Math类以静态方法的方式提供常用的数学方法, 其中Math.random()方法是一个可以产生[0.0,1.0]区间内的一 ...

  9. 获取连续生成的100-200范围的随机数,直到生成的随机数与前一个随机数相等,停止运行

    编写程序,获取连续生成的100-200范围的随机数,直到生成的随机数与前一个随机数相等,停止运行 题目:编写程序,获取连续生成的100-200范围的随机数,直到生成的随机数与前一个随机数相等,停止运行 ...

  10. 在多个指定区间内生成随机数,且随机数总和固定算法

    在多个指定区间内生成随机数,且随机数总和固定算法 一.介绍 最近项目上遇到了一个需求就是在多个指定区间内生成总和恒定的随机数. 示例:在[1-3].[4-20].[24-100]区间上分别生成一个随机 ...

最新文章

  1. python 货币合适_算法之Python实现 - 001 : 换钱的最少货币数
  2. nginx学习文档之二 配置负载均衡-windows配置负载均衡
  3. java struts2下载zip_Struts2多文件下载
  4. Python 06 编码
  5. 分子生物学知识点归纳
  6. cox回归模型python实现_Cox回归分析及其SPSS操作方法概述
  7. win10连接文件服务器记住密码如何删除,win10系统访问共享文件夹需要密码的取消方法...
  8. Unity中游戏的存档与读档
  9. 遥感图像计算机自动分类原理,第30讲:8.1遥感图像自动识别分类
  10. VMware 安装 Linux 系统
  11. 无奈的春招,Momenta你好|春招面经整理
  12. 十进制转换为二进制、原码、反码、补码、移码
  13. 学海无涯!腾讯、网易必问的20道题Android面试题,已拿offer入职
  14. cocos制作水滴粘连效果
  15. JAVA常见的命名规则:见名知意
  16. Spark 3.x各模式部署 - Ubuntu
  17. Tomorrow never knows?(C程序设计进阶第2周)
  18. 文盲+wordpress搭建个人博客类网站
  19. python修炼之pip基本命令
  20. easypoi导入excel

热门文章

  1. 小白基础知识必备|| 整型常量与进制间的转换
  2. 微信登陆失败redirect_uri 域名与后台配置不一致 10003(thinkphp)
  3. 常用数学符号大全、关系代数符号
  4. 【搜索引擎】提高 Solr 性能
  5. SILENTCAST是另一类UBUNTU最好的GIF视频录制器
  6. compile函数使用
  7. C++著名库的比较和学习经验
  8. Python values()函数用法
  9. 台湾大学林轩田机器学习技法课程学习笔记8 -- Adaptive Boosting
  10. 讲师靓照大集合,为最喜爱的讲师投票吧!iOS DevCamp Android DevCamp