随机有理数生成

2023-12-19

有理数是可数的。例如,此代码在开区间 0..1 中查找第 k 个有理数,排序为{n1, d1}是在之前{n2, d2} if (d1<d2 || (d1==d2 && n1<n2))假设{n,d}是互质的。

RankedRational[i_Integer?Positive] := 
 Module[{sum = 0, eph = 1, den = 1},
  While[sum < i, sum += (eph = EulerPhi[++den])];
  Select[Range[den - 1], CoprimeQ[#, den] &][[i - (sum - eph)]]/den
  ]

In[118]:= Table[RankedRational[i], {i, 1, 11}]

Out[118]= {1/2, 1/3, 2/3, 1/4, 3/4, 1/5, 2/5, 3/5, 4/5, 1/6, 5/6}

现在我想生成随机有理数,给定分母上界,均匀地排序,以便对于足够大的分母有理数将在单位区间上均匀分布。

直观上,我们可以在所有具有相同权重的小分母的有理数中进行选择:

RandomRational1[maxden_, len_] := 
 RandomChoice[(Table[
     i/j, {j, 2, maxden}, {i, 
      Select[Range[j - 1], CoprimeQ[#, j] &]}] // Flatten), len]

是否可以更有效地生成具有这种分布的随机有理数,而不需要构造所有有理数?这张桌子不需要太多就能变得很大。

In[197]:= Table[RankedRational[10^k] // Denominator, {k, 2, 10}]

Out[197]= {18, 58, 181, 573, 1814, 5736, 18138, 57357, 181380}

或者也许可以有效地生成具有不同“感觉均匀”分布的有界分母的有理数?


EDIT This is Mathematica code which runs acceptance-rejection generation suggested by btilly.
Clear[RandomFarey];
RandomFarey[n_, len_] := Module[{pairs, dim = 0, res, gcds},
  Join @@ Reap[While[dim < len,
      gcds = cfGCD[pairs = cfPairs[n, len - dim]];
      pairs = Pick[pairs, gcds, 1];
      If[pairs =!= {}, 
       dim += Length@Sow[res = pairs[[All, 1]]/pairs[[All, 2]]]];
      ]][[2, -1]]
  ]

以下编译函数生成整数对{i,j}这样1<=i < j<=n:

cfPairs = 
  Compile[{{n, _Integer}, {len, _Integer}}, 
   Table[{i, RandomInteger[{i + 1, n}]}, {i, 
     RandomChoice[2 (n - Range[n - 1])/(n (n - 1.0)) -> Range[n - 1], 
      len]}]];

下面的编译函数计算 gcd。它假设输入是一对正整数。

cfGCD = Compile[{{prs, _Integer, 1}}, Module[{a, b, p, q, mod},
    a = prs[[1]]; b = prs[[2]]; p = Max[a, b]; q = Min[a, b]; 
    While[q > 0, mod = Mod[p, q]; p = q; q = mod]; p], 
   RuntimeAttributes -> Listable];

Then

In[151]:= data = RandomFarey[12, 10^6]; // AbsoluteTiming

Out[151]= {1.5423084, Null}

In[152]:= cdf = CDF[EmpiricalDistribution[data], x];

In[153]:= Plot[{cdf, x}, {x, 0, 1}, ImageSize -> 300]

我强烈建议看看任意有理数的“猜数字”游戏? https://stackoverflow.com/questions/5440688/the-guess-the-number-game-for-arbitrary-rational-numbers以获得有关您的根本问题的一些灵感。

如果您的目标是尽快达到大致均匀,并且您不介意选择具有不同概率的不同有理数,则以下算法应该是有效的。

lower = fractions.Fraction(0)
upper = fractions.Fraction(1)

while lower < upper:
    mid = (upper + lower)/2
    if 0 == random_bit():
        upper = largest_rational_under(mid, denominator_bound)
    else:
        lower = smallest_rational_over_or_equal(mid, denominator_bound)

请注意,这两个辅助函数都可以通过将 Stern-Brocot 树向中间移动来计算。另请注意,通过一些细微的修改,您可以轻松地将其转换为迭代算法,该算法输出一系列有理数,并最终以相等的可能性在区间内的任何位置收敛。我认为那个属性有点不错。


如果您想要最初指定的精确分布,并且rand(n)给你一个随机整数1 to n,那么以下伪代码将适用于分母界限n:

Try:
    k = rand(n * (n+1) / 2)
    do binary search for largest j with j * (j-1) / 2 < k
    i = k - (j * (j-1) / 2)
    if (i, j) are not relatively prime:
        redo Try
answer = i/j

平均而言,对于大型n你必须Try约2.55倍。所以在实践中这应该是非常有效的。

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

随机有理数生成 的相关文章

  • Mathematica 列表轮廓图3D

    我有表格中的数据 x y z f 我在用ListContourPlot3D但我得到的只是一个空盒子 每个方向的尺寸为 1 到 1 这是我的代码 ListContourPlot3D data5 PlotRange gt All AxesLab
  • 如何将时间间隔划分为不同长度的部分?

    我有一个从 0 到t 我想把这个区间分成一个以2 25 2 25 1 5为周期的累积序列 方法如下 input start 0 stop 19 output sequence 0 2 25 4 5 6 8 25 10 5 12 14 25
  • 在python中实现特定的分布

    我想回来1
  • Mathematica 圆柱分解的计算复杂度是多少

    数学 圆柱分解 http reference wolfram com mathematica ref CylindricalDecomposition html实现一种称为圆柱代数分解的算法 Wolfram MathWorld 的文章圆柱代
  • 限制纬度和经度值的模数

    我有代表纬度和经度的双精度数 我可以轻松地将经度限制为 180 0 180 0 具有以下功能 double limitLon double lon return fmod lon 180 0 360 0 180 0 这是有效的 因为一端是排
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • 为什么循环引导迭代算法的数组大小必须为 3^k+1?

    The 循环引导迭代算法 http www geeksforgeeks org an in place algorithm for string transformation 是一种通过将所有偶数项移至前面并将所有奇数项移至后面同时保留其相
  • 从 Go Slice 中选择一个随机值

    情况 我有一些值 需要从中随机选择一个值 然后我想将它与固定字符串连接起来 到目前为止 这是我的代码 func main create the reasons slice and append reasons to it reasons m
  • 构建协同过滤/推荐系统

    我正在设计一个网站 该网站的概念是根据用户的口味向他们推荐各种商品 即他们评价过的项目 添加到收藏夹列表中的项目等 亚马逊 Movielens 和 Netflix 就是这样的例子 现在 我的问题是 我不知道从哪里开始了解这个系统的数学部分
  • 如何生成泊松过程?

    原问题 我想生成一个泊松过程 如果按时间到达的人数t is N t 我有一个带有参数的泊松分布 我如何生成N t 我将如何在 C 中做到这一点 澄清 我最初想使用泊松分布生成过程 但是 我对我需要的过程参数感到困惑 我以为我可以用N t 但
  • 从文件夹中选择随机图像以显示在 picturebox、vb.net 中

    我有一个图片框 它从文件夹中读取图像进行显示 而不是通常的无聊图像 我认为在文件夹中包含许多图像并让我的 vb net 程序随机挑选一个来显示可能会更好使用 我怎样才能做到这一点 尝试这个 Public Function GetRandom
  • 判断一个点是否在直角三角形内

    我一直想知道最简单的方法来确定一个点是否位于三角形内 或者在这种情况下 判断一个点是否位于对角线切成两半的矩形内 假设我有一个 64x64 像素的矩形 对于这个矩形 如果传递的点位于矩形的左上角 我想返回 TRUE 值 否则返回 FALSE
  • 随机字符串生成器产生相同结果的问题

    我使用随机字符串生成器 基于此 http stackoverflow com questions 1344221 how can i generate random 8 character alphanumeric strings in c
  • 生成随机数背后的数学(崩溃游戏 BTC Casino)

    我正在开发一款基于网络的游戏 其中有多个迷你游戏 我们坚持还添加一个在赌博界非常流行的崩溃游戏 然而 我们一直在努力理解生成随机 几乎不可预测 数字的概念 大多数赌博网站都会提供哈希值等来证明数字未被篡改 我们真的不需要这个 因为我们的游戏
  • 加速球之间的碰撞检测

    我正在编写一个物理引擎 模拟器 其中包含 3D 太空飞行 行星 恒星引力 船舶推力和相对论效应 到目前为止 一切进展顺利 但是 我需要帮助的一件事是碰撞检测算法的数学 我使用的运动迭代模拟基本上如下 注意 3D 矢量全部大写 For eac
  • 基本的 Python OpenCV 裁剪和调整大小

    有人可以帮我一些裁剪算法吗 它的 openCV 我想弄清楚这一点 我知道方法是crop image y y1 x x1 如果我有一个带有 new dimensionXxnew dimensionY 像素的图像 并且我想将其裁剪为相同的宽度
  • 内存高效的随机数迭代器,无需替换

    我觉得这应该很容易 但经过多次搜索和尝试后我找不到答案 基本上 我有大量的物品 我想以随机顺序进行采样 而不需要更换 在本例中 它们是二维数组中的单元 我用于较小数组的解决方案不会转换 因为它需要对内存数组进行改组 如果我必须采样的数量很小
  • Math.random() 在 JavaScript 中如何工作?

    我最近想出了如何通过谷歌获取随机数 这让我思考如何Math random 工作 所以我在这里我无法弄清楚他们是如何做到 Math random 的 除非他们使用了类似时间的东西 有谁知道 JavaScript 是如何做到的吗 Math ra
  • 如何求两个地点的经纬度距离?

    我有一组位置的纬度和经度 怎么找distance从集合中的一个位置到另一个位置 有公式吗 半正矢公式假定地球是球形的 然而 地球的形状更为复杂 扁球体模型会给出更好的结果 如果需要这样的精度 你应该更好地使用文森特逆公式 See http
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例

随机推荐

  • gdb 堆栈奇怪

    我有时会得到这个奇怪的回溯 gdb bt 0 0x00002b36465a5d4c in AY16 Loop M16 from opt intel mkl 10 0 3 020 lib em64t libmkl mc so 1 0x0000
  • Python fastcgi 客户端

    我正在用 python 编写一个工具来监控 fastcgi 应用程序 我唯一需要 fastcgi 的是加载 ping 和状态页面 如果失败则返回某种错误 有很多库 从 python fasctgi 绑定到twisted 似乎能够做到这一点
  • Zend Framework 2 模块在 Bootstrap 控制器之间共享变量

    是否可以在 Module php 中创建变量甚至共享对象 如数据库适配器 以在所有视图控制器中使用 Zend 框架 2 例如 class Module public function onBootstrap MvcEvent e modul
  • python:腌制c对象

    首先 我并不期待解决方案 只是希望得到一些关于如何开始的指导 我有一个带有嵌入式 Python 解释器的 C 程序 程序用作输入的 Python 脚本显然是指 C 定义的对象和函数 我现在想让其中一些对象可腌制 pickle 文档描述了如何
  • Plone/z3c.form 3.2.1-如何使自动完成小部件(不是必填字段)使用自定义绑定源对象?

    我正在尝试使用绑定的源对象获取自动完成小部件以表单 z3c form 呈现 在接口类中 Parent schema Choice title u A Parent source ParentSourceBinder required Fal
  • Bootstrap Validator - 验证成功时发出警报

    我在用着引导验证器 http bootstrapvalidator com 插件来验证我的表单 我试图在表单成功验证时发出警报 HTML
  • LINQ To Entities 无法识别数组索引

    我的代码中有以下功能 public List
  • 如何以不同的方式设置标准 GWT 组件 (TabBar) 的样式?

    我正在使用 TabBar 并且想以不同的方式设置组件的样式 所以一次是这种风格 另一次是那种风格 我以为这会起作用 但事实并非如此 TabBar t new TabBar t addTab 1 t addTab 2 t addStyleNa
  • 将 stdint 与 swig 和 numpy.i 一起使用

    我正在开发一个模块来使用c inline在Python代码中基于swig 为此我想做numpy数组可访问于C 到目前为止我使用的 C 类型如下unsigned short但我想使用类似的类型uint16 t from stdint h保存我
  • Python 文档 (:obj:`str`) 与 (str)

    我一直在读这个Google 风格 Python 文档字符串示例 http sphinxcontrib napoleon readthedocs io en latest example google html了解 Python 文档的编写程
  • 创建查询以获取未完成呼叫的计数

    有表 waiter log 作为 call id queue num curr ast num curr proceed wait f27de4f 9010 2 1 f27de4f 9002 5 1 f27de4f 9003 1
  • WatchOS 3 中的本地通知

    我正在使用 WatchOS 3 beta 并尝试在手表上启动本地通知 该界面只是一个按钮 它调用下面代码中的 buttonPushed 方法 该应用程序运行良好 但我从未收到通知 应用程序结构是 Xcode 8 中 WatchKit 应用程
  • 如何调整mysql命令行的显示设置?

    mysql 命令行未正确显示结果 我的意思是表的某些列位于第一行 某些列位于第二行 输出也分为两行 如何调整这些设置才能正确显示结果 您可以使用 G命令 而不是 在 SQL 查询的末尾 Example SELECT FROM USER G
  • 使用NamedParameterJdbcTemplate将数据发送到DataBase

    package com techm template import java sql Types import java util Date import java util HashMap import java util Map imp
  • 如何计算 TCP 校验和

    我正在编写一个内核模块 它使用 Netfilter 挂钩来修改一些 TCP 标头信息 显然 在发送之前 我想重新计算校验和 我还在接收端编辑了标头 所以我也需要在那里重新计算它 在网上搜索 我发现有人说我可以简单地将其设置为0 它会为我计算
  • 排除迁移的属性[重复]

    这个问题在这里已经有答案了 I have 特性在我的模型上 我不想在中生成字段tables迁移后 是否可以排除特性实体框架核心迁移 我的模型上是否有模型的属性或某些 Fluent API 方法DbContext为了这 您应该能够指定 Not
  • WordPress:如何从自定义分类查询中排除子分类中的帖子?

    我的 WordPress 主题有一个名为 集合 的自定义分类法 自定义分类是分层的 因此存在子集合 我有一个名为 书籍 的集合和一个名为 小说 的子集合 有些帖子只在 书籍 中 有些帖子则在 小说 中 我希望 书籍 集合的页面仅显示主 书籍
  • C# 中的可滚动消息框

    我在VS2008 C 中使用Addin 我需要显示消息 错误消息和其他消息 我不知道消息的长度 因此我想使用 Scrollable MessageBox 我找到了 2007 年的这篇文章 作者 Mike Gold 2007 年 7 月 30
  • NSMutableArray arrayWithArray:与 initWithArray:

    这些都在我的应用程序中工作 没有任何明显的区别 1 theArray NSMutableArray alloc initWithArray NSKeyedUnarchiver unarchiveObjectWithData theData
  • 随机有理数生成

    有理数是可数的 例如 此代码在开区间 0 1 中查找第 k 个有理数 排序为 n1 d1 是在之前 n2 d2 if d1