随机数生成器和 4 字节与 8 字节整数中的溢出

2023-12-01

著名的线性同余随机数生成器也称为最小标准使用公式

x(i+1)=16807*x(i) mod (2^31-1)

我想用 Fortran 来实现这个。

然而,正如《Numerical Recipes》所指出的,直接用默认的Integer类型(32位)实现公式会导致16807*x(i)溢出。

所以本书推荐Schrage的算法是基于m的近似因式分解。该方法仍然可以使用默认的整数类型来实现。

然而,我想知道 fortran 实际上有Integer(8)其范围为的类型-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807这比16807*x(i)可能。

但书上还说了下面这句话

不可能直接实现方程(7.1.2)和(7.1.3) 在高级语言中,由于 a 和 m − 1 的乘积超过了 32 位整数的最大值。

那么为什么我们不能直接使用Integer(8)输入直接执行公式?


是否可以拥有 8 字节整数取决于您的编译器和系统。更糟糕的是传递给的实际值kind获得特定的精度并没有标准化。虽然我知道的大多数 Fortran 编译器都使用字节数(因此 8 就是 64 位),但这并不能保证。

您可以使用selected_int_kind方法得到一种int是有一定范围的。这段代码在我的 64 位计算机上编译并且运行良好:

program ran
    implicit none
    integer, parameter :: i8 = selected_int_kind(R=18)
    integer(kind=i8) :: x
    integer :: i
    x = 100
    do i = 1, 100
        x = my_rand(x)
        write(*, *) x
    end do

    contains
        function my_rand(x)
            implicit none
            integer(kind=i8), intent(in) :: x
            integer(kind=i8) :: my_rand
            my_rand = mod(16807_i8 * x, 2_i8**31 - 1)
        end function my_rand
end program ran

以下@VladimirF 评论的更新和解释

现代 Fortran 提供了一个名为iso_fortran_env提供引用标准变量类型的常量。在你的情况下,人们会使用这个:

program ran
    use, intrinsic :: iso_fortran_env, only: int64
    implicit none
    integer(kind=int64) :: x

然后如上所述。这段代码比旧的更容易阅读selected_int_kind。 (为什么R一定要回到18岁吗?)

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

随机数生成器和 4 字节与 8 字节整数中的溢出 的相关文章

  • 在 C 或 C++ 中用 1 到 10^10 之间的随机数填充数组

    我的分配的一部分基于一个数组 其大小由用户指定 其中包含从 1 到 10 10 的随机数 然后我们必须找到数组中第 k 个较小的数字 这是我尝试过的 include
  • rand() 的实现

    我正在用 C 编写一些嵌入式代码 需要使用 rand 函数 不幸的是 控制器的库不支持 rand 我需要一个快速的简单实现 但更重要的是空间开销很小 可以产生相对高质量的随机数 有谁知道使用哪种算法或示例代码 编辑 它用于图像处理 因此 相
  • 使用 Fortran 90 正确读取输入文件中的注释行

    据我了解 Fortran 在从文件读取数据时 会跳过以星号 开头的行 假设它们是注释 好吧 我似乎在用我创建的一个非常简单的程序实现这种行为时遇到了问题 这是我的简单 Fortran 程序 1 program test 2 3 intege
  • 在 Excel 中生成随机 -1 和 +1 值

    The Rand 函数会生成一个 0 到 1 之间的实数 这Randbetween 1 1 将生成 1 0 或 1 我想要的只是 1或1 那么 1 到 1 之间的实数呢 Easy IF RAND lt 0 5 1 1 要获得实数 请使用 R
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • 用于稀疏矩阵的 Fortran 90/95 库?

    我正在寻找一个用于处理 Fortran 90 95 中稀疏矩阵的库 我只需要非常基本的运算 例如矩阵向量乘法 你建议我用什么 我搜索了一下 找到了 BLAS 的一个扩展 称为 稀疏 blas 记录在blast技术论坛规范的第 3 章中 ht
  • C++ 相当于 C# 中的 new Random(seed)

    当我们在 C 中使用随机数生成器时 我们可以定义一个变量 例如 private Random rndGenerator 在课堂上然后打电话 rndGenerator new Random seed 正确地在类的构造函数中 我的问题是 这种定
  • C 编程中的 rand() 问题? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我总是用 rand 得到相同的随机数序列 https stackoverflow com questions 1108780 why do i always get the same seque
  • 当输入字符而不是数字时,防止 FORTRAN 关闭

    我有一个读取语句需要一个数字 非常简单的示例代码 program test integer var read var end 问题是我通常输入一串字符 即 yes 因为分心 如何防止我的代码完全停止并显示以下类型的错误消息您输入了错误的值
  • 如何在fortran中调用和使用另一个子程序中的子程序?

    我正在编写一个程序 其中主程序包含许多子例程和函数 为了构造主程序的这些子程序之一 假设是子程序 A 我需要使用另一个子程序 假设是 B 我的问题是 如何调用子程序A并使用子程序B 我是初学者 我已经搜索了很多 但没有找到我清楚理解的东西
  • 删除字符串中的空格

    我有以下代码 program main character len 15 abc te st tex t print trim abc end program main 哪个输出 te st tex t 我排除了所有要删除的空白 但事实并非
  • 如何在 Fortran 中实现数组结构而不是结构数组?

    我正在使用 Fortran 编写有关 CFD 主题的代码 在与一些计算机科学领域的朋友讨论后 他们告诉我 如果在他 她的代码中实现数组结构 SoA 而不是结构数组 AoS 可以加快计算时间 我见过很多关于这个主题的实现的例子 但大多数都是用
  • 如何从 Java 中的 Random 中获取种子?

    我正在为某个对象创建深度克隆 该对象包含一个Random 从种子中取回种子是个好习惯吗 Random 如果是这样 怎么办 没有一个Random getSeed 获取种子的一种更简单的方法是生成一个种子并将其存储为种子 我正在游戏中使用这种方
  • php洗一副牌

    我想使用 php 创建随机桥手的集合 我认为我可以将有序的卡片包编码为字符串 deal下面 我喜欢它有 52 个字母 同时考虑大小写 我发现了 php 函数str shuffle 所以我想我可以做以下事情 pack abcdefghijkl
  • 涉及随机数的单元测试算法

    我正在编写一些关于分形和随机地形生成的代码 具体来说 我现在正在使用 Diamond Square 算法 对于那些不知道的人来说 它基本上每一步都会获得四个值的平均值 并添加一个随机数 我将如何测试结果 我应该使用已知的种子并手动计算平均值
  • 科学 Fortran 编译错误

    我正在研究科学建模程序 但还没有让我的程序编译 我没有碰过我的教授坚持认为以前有效的代码 只碰过 makefile 经过多次尝试 我得到的最远的是这个错误 Error on line 1112 Declaration error for x
  • 回滚Python中的随机数生成器?

    是否可以通过指定的步数将随机数生成器 回滚 到较早的状态以获得重复的随机数 我希望能够做这样的事情 print random random 0 5112747213686085 print random random 0 404934137
  • 在 Ruby 中生成正则表达式模式的字符串

    在Python语言中我发现rstr https bitbucket org leapfrogdevelopment rstr 可以生成一个字符串regex http en wikipedia org wiki Regular express
  • Julia 中随机输出的数组理解

    如果我今天早些时候问过这个问题 那么这个问题是一个延伸 https stackoverflow com questions 44097910 killing a for loop in julia array comprehension 基
  • 生成不同的 smarty 随机数

    我正在使用 smarty v2 6 我想生成随机的不同数字 我正在寻找一种有效 快速的方法来使用已经提供的 Smarty 功能来完成此操作 这是我生成 5 个随机数 但不不同 的代码 assign var min value 1 assig

随机推荐

  • ARCore:模型显示在脸部上方

    我正在尝试遵循以下指南 了解如何为以下内容创建自定义 3D 模型 增强面孔但由于某种原因 我的模型确实超出了我的想象 我的模型也在 0 x y 和 z 轴上 对于我正在使用的代码这个示例项目由谷歌提供 中心点 检查 a 的位置在哪里pivo
  • 两个如何用python水平合并多个.csv文件?

    我有几个 csv 文件 10 需要将它们水平合并到一个文件中 每个文件具有相同的行数 300 和 4 个标题行 这些标题行不一定相同 但不应合并 仅从第一个 csv 文件获取标题行 行中的标记以逗号分隔 中间没有空格 作为一个Python菜
  • Struts2 约定插件在 Tomcat 8.x 上损坏 - org.apache.struts2.convention.PackageBasedActionConfigBuilder.error 无法扫描命名包

    我正在使用 Struts 2 3 16 以及相同版本的约定插件 该应用程序在 Tomcat 7 0 35 上运行良好 但在 Tomcat 8 0 3 0 上失败并出现以下异常 11 May 2014 06 26 01 421 WARNING
  • 使用包含过滤器在环回中连接两个模型

    我有两个模型 Purchase 和 Products productId 对于这两个模型来说是通用的 我需要从产品模型中找到purchaseId 的productDetails 因此 我在购买模型中创建了一个自定义端点 称为 getProd
  • R 中的多级饼图

    我想制作一个非常简单的多层饼图 如下所示 正如你所看到的 我已经了解 sunburstR 但 因为我正在寻找一个更简单的解决方案 这并不完全应该是这样 此外 我更希望能够轻松地将其导出为矢量图形 第二种解决方案 使用 ggplot2 在极坐
  • HashSet 的最大大小

    所以基本上我生成随机 10000 个 IP 地址 我想存储在 HashSet 中找到的所有 IP 地址 但根据我的计算 找到了大约 6000 个 IP 地址 但在 HashSet 中只存储了 700 个 IP 地址 HashSet在存储St
  • 获取DataTable中值的索引

    我需要获取数据表中值的索引 我正在努力变得那样 SqlDataAdapter da new SqlDataAdapter SELECT MessageID SenderID MessageContent FROM Messages WHER
  • JavaScript 数组拼接

    StackOverflow 社区您好 目前我完全被我的代码困住了 尝试了不同的方法来从数组中删除选择的值 我知道我必须使用 splice 来实现它 但由于某种原因它没有做我想要它做的事情 由于我的英文不太好 这个网页很难解释 所以我做了一些
  • Python 中解包参数列表/字典案例中的关键字参数

    对于 python 我可以使用如下解包参数 def hello x y z print x x print y y print z z hello 1 1 2 3 a 1 b 2 c 3 hello 1 1 2 3 a 1 b 2 c 3
  • “rep”函数中的“each”参数有多个值吗?

    如何为R中 rep 函数中的 each 参数分配多个值 一个简单的示例 其中向量中的每个值连续重复 3 次 a lt seq 2 6 2 rep a each 3 但是 如果我在 each 参数中添加多个值以更改每个值的重复次数 则它无法正
  • 删除包含特定单词的列

    我有一个包含 313 列 约 52000 行信息的数据集 我需要删除包含 权限 一词的每一列 我尝试过 grep 和 dplyr 但我似乎无法让它工作 我已经读过该文件 testSet lt read csv Users data csv
  • 手机休眠时的 BroadcastReceiver 行为

    我不太确定 a 的行为是什么BroadcastReceiver 在清单中注册并通过以下方式启用PackageManager 是手机休眠时 出现这个问题是因为我需要一个注册广播的接收器WifiManager
  • 为什么此 C# 代码会抛出错误:使用未分配的局部变量“n”

    在 MSDN 上 此代码发布于https learn microsoft com en us dotnet csharp language reference keywords try catch我无法理解为什么它会抛出错误 使用未分配的局
  • IEEE-754:有理数集的基数

    有理数集的基数是多少 这些有理数具有与单精度 IEEE 754 兼容的浮点格式的精确表示 有 2139095039 个有限正浮点数 有尽可能多的有限负浮点数 您想要将 0 0 和 0 0 作为两项还是一项包含在内 根据答案 总数为 2 21
  • 比较 2 个数组的元素并返回计数 JavaScript

    我有 2 个数组 需要相互比较并返回相同的计数 示例 将 array1 abcd 与 array2 adce 进行比较 返回值为 2 1 因为 a 和 c 都处于相同位置 而 d 处于错误位置 function var index 0 fo
  • jQuery 形式的 .change 函数存在问题

    我正在编写一个脚本 该脚本根据选择菜单中的用户输入更改跨度文本值 我当前的脚本有问题 如何解决此问题 以便当我单击 结束日期 然后再次单击 开始日期 时 它会在范围中显示 开始日期 Demo http jsfiddle net 197ncb
  • 将“IntStream”打印为“String”的最简单方法

    使用 Java 8 我可以轻松地处理String 或任何CharSequence as an IntStream使用任一chars or the codePoints method IntStream chars Hello world c
  • 另一个变量版本最高的总和(整个数据中没有最大版本)

    我正在努力让这项措施发挥作用 我想要一个度量 仅对每栋房屋的最大版本的值进行求和 因此 请遵循此示例表 House Id Version Id Value 1 1 1000
  • c / 中断系统调用 / fork 与线程

    我发现了线程实现的一个问题 这对我来说很奇怪 也许你们中的一些人可以向我解释一下 那就太好了 我正在开发类似代理的程序 它是一个程序 在不同的机器上运行 通过 eth0 接收数据包并通过 ath0 无线 将其发送到另一台正在执行完全相同操作
  • 随机数生成器和 4 字节与 8 字节整数中的溢出

    著名的线性同余随机数生成器也称为最小标准使用公式 x i 1 16807 x i mod 2 31 1 我想用 Fortran 来实现这个 然而 正如 Numerical Recipes 所指出的 直接用默认的Integer类型 32位 实