如何有效地将几个字节转换为一个范围之间的整数?

2023-12-09

我正在写一些读取字节的东西(只是一个List<int>)来自远程随机数生成源,速度非常慢。为此和我的个人要求,我想检索源中尽可能少的字节.

现在我正在尝试实现一种签名如下的方法:

int getRandomInteger(int min, int max)

我有两种理论如何从我的随机源中获取字节,并将它们转换为整数。

方法#1 很天真。拿来(max - min) / 256字节数并将它们相加。它可以工作,但是它将从我拥有的慢速随机数生成器源中获取大量字节。例如,如果我想获得一百万到零之间的随机整数,它将获取近 4000 字节......这是不可接受的。

方法#2 对我来说听起来很理想,但我无法想出算法。事情是这样的:

我们以 min: 0, max: 1000 为例。

  • 计算ceil(rangeSize / 256)在这种情况下是ceil(1000 / 256) = 4。现在从源中获取一 (1) 个字节。
  • 将这一字节从 0-255 范围缩放到 0-3 范围(或 1-4),并让它确定我们使用哪一组。例如。如果字节是 250,我们会选择第四组(代表最后 250 个数字,在我们的范围内 750-1000)。
  • 现在获取另一个字节并从 0-255 到 0-250 进行调整,并让它确定我们在组中的位置。因此,如果第二个字节是例如120,那么我们最终的整数是750 + 120 = 870.

在这种情况下,我们总共只需要获取 2 个字节。然而,它要复杂得多,因为我们的范围是 0-1000000,我们需要几个“组”。

我该如何实现这样的事情?我可以接受 Java/C#/JavaScript 代码或伪代码。

我还想保持结果不丢失熵/随机性。所以,我有点担心缩放整数。


不幸的是,你的方法 #1 被破坏了。例如,如果最小值为 0,最大值为 510,则需要添加 2 个字节。只有一种方法可以获得 0 结果:两个字节都为零。出现这种情况的几率是 (1/256)^2。然而,有很多方法可以获取其他值,例如 100 = 100+0、99+1、98+2...因此 100 的机会要大得多:101(1/256)^2。

做你想做的事情的或多或少的标准方法是:

Let R = max - min + 1   -- the number of possible random output values
Let N = 2^k >= mR, m>=1  -- a power of 2 at least as big as some multiple of R that you choose.
loop
   b = a random integer in 0..N-1 formed from k random bits
while b >= mR -- reject b values that would bias the output
return min + floor(b/m)

这称为拒绝法。它丢弃随机选择的二进制数,这些二进制数会使输出产生偏差。如果min-max+1恰好是 2 的幂,那么你的拒绝率将为零。

如果你有m=1 and min-max+1只要比 2 的大幂多 1,那么拒绝率就会接近一半。在这种情况下,你肯定想要更大的m.

一般来说,较大的 m 值会导致较少的拒绝,但当然它们需要每个数字稍多的位数。有一个概率最优算法可供选择m.

这里提出的其他一些解决方案也有问题,但很抱歉,我现在没有时间发表评论。如果有兴趣的话也许过几天吧。

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

如何有效地将几个字节转换为一个范围之间的整数? 的相关文章

  • 如何同时接受int和float类型的输入?

    我正在制作一个货币转换器 如何让 python 同时接受整数和浮点数 我就是这样做的 def aud brl amount From to ER 0 42108 if amount int if From strip aud and to
  • C++ Exp 与 Log:哪个更快?

    我有一个 C 应用程序 需要比较两个值并决定哪个值更大 唯一的复杂之处是一个数字在对数空间中表示 而另一个则不是 例如 double log num 1 log 1 23 double num 2 1 24 如果我想比较num 1 and
  • java数学中的组合“N选择R”?

    java库中是否有内置方法可以为任何N R计算 N选择R 公式 实际上很容易计算N choose K甚至不需要计算阶乘 我们知道 公式为 N choose K is N N K K 因此 公式为 N choose K 1 is N N N
  • 如何在 C++ 中追加一个整数(用一个整数)

    我想知道是否有人可以告诉我如何在 C 中附加一个整数 与另一个整数 基本上 如果我有一个值为 67 的 int 我如何将它与数字 4 一起附加 以便整数现在为 674 提前致谢 将第一个乘以十的第二个位数次方 然后加上另一个 示例 63 和
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • Python中非常大的整数的math.pow是错误的[重复]

    这个问题在这里已经有答案了 我试图通过计算一个整数的非常大的幂来打印一个非常大的数字 尽管我的代码是正确的 但我没有观察到所需的输出 一般来说 Python解释器可以打印系统内存支持的非常大的整数 考虑到这个假设 下面是我正在运行的代码 a
  • Solr 不搜索整数?

    我目前正在使用 Solr 为电子商务网站开发搜索引擎 所以我在 schema xml 中得到这两个字段
  • 在 Swift 中将单个整数值视为一个范围

    我需要验证字符串的长度 字符计数允许的值为 6 9 个字符 12个字符 15 个字符 所有具有不同字符数的字符串均无效 因此 我想创建一个 Swift 函数 它接受多个范围并计算字符串 extension String func evalu
  • 确保 unsigned int/long 始终在 C# 中的检查上下文中执行

    有没有人觉得奇怪 uint 和 ulong 的默认上下文是未检查的 而不是检查的 因为它们旨在表示永远不能为负的值 因此 如果某些代码试图违反该约束 在我看来 自然且首选的行为是抛出异常 而不是返回最大值 这很容易使重要数据处于无效状态并且
  • 在unity3D中显示数学方程

    我想使用它的 GUI 系统统一显示数学方程 有办法吗 我正在使用 C 语言在 Unity 中进行编程 如果我还可以使用 C 代码显示数学符号 这对我来说会很有用 谢谢 自 2016 年起 您可以使用TEXDraw https assetst
  • C/C++:指针算术

    我在读一点 指针算术 发现有两件事我无法理解 也不知道它的用途 address expression address expression and also address expression gt address expression
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在
  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial
  • JSON 转换带有整数键的 Map

    我有一个测试代码的小样本 我尝试将 Map 转换为 JSON 字符串并返回 在解析 JSON 字符串时 结果映射包含字符串键 1 而不是整数键 1 从而导致测试失败 用作此映射的键的 POJO 也会发生同样的情况 这是预期行为还是我省略了
  • 将所有 BigDecimal 运算设置为特定精度?

    我的Java程序以高精度计算为中心 需要精确到至少120位小数 因此 程序中所有非整数都将由 BigDecimal 表示 显然 我需要指定 BigDecimal 的舍入精度 以避免无限小数表达式等 目前 我发现必须在 BigDecimal
  • 线性问题和非线性问题之间的区别?点积和核技巧的本质

    核技巧将非线性问题映射为线性问题 我的问题是 1 线性问题和非线性问题的主要区别是什么 这两类问题的差异背后的直觉是什么 核技巧如何帮助在非线性问题上使用线性分类器 2 为什么点积在这两种情况下如此重要 Thanks 当人们说到分类问题的线
  • 如何使用NSDecimalNumber?

    我正在构建一个需要对金钱进行计算的应用程序 我想知道如何正确使用 NSDecimalNumber 特别是如何从整数 浮点数和双精度数初始化它 我只发现它很容易使用 decimalNumberWithString 方法 这 initWith
  • 以编程方式分解大量数字

    好吧 所以我有一个巨大的数字f 实际上 这个数字只有 100 多位数字长 我知道这些因子的大小大致相同 如果我的资源和时间有限 我应该使用什么语言和算法 我包括在限制时间内编写算法的时间长度 想法 编辑 我所说的有限是指在尽可能短的时间内
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆

随机推荐

  • AjaxUploadControl 不触发 onuploadcomplete 方法

    我正在尝试在我的网站上实现 AjaxUploadControl 功能 但它不会触发 OnUploadComplete 方法 相反 它只是说文件已上传 100 但该文件不在指定的文件夹中 我在 OnUploadComplete 方法中设置了断
  • 从 python 数组中切片偶数/奇数行的最短方法?

    或者 一个更普遍的问题是 如何对数组进行切片以获取每个第 n 行 因此对于偶数 奇数 您希望跳过一行 但在一般情况下 您希望获得每个 n 第 3 行 跳过 n 1 行 假设你正在谈论一个list 您指定切片中的步骤 和开始索引 语法是lis
  • 如何判断文件共享服务器是否在线? [复制]

    这个问题在这里已经有答案了 如果我想检查服务器可用性但不知道其共享 我什至可以在 Windows 资源管理器窗口中键入其 UNC 名称 或 IP 地址 没有服务器共享目录 我如何在 NET中以编程方式使用它来验证服务器是否在线 我想 My
  • 添加PhoneStateListener

    我正在尝试设置PhoneStateListener但我得到一个PhoneCallListener cannot be resolved to a type public class ButtonView extends FrameLayou
  • 如果文本字段为空,如何禁用按钮?

    我无法禁用我的按钮 在下面的代码中 accept is a Button and email is a TextField email setOnAction ae gt if email getText isEmpty accept se
  • Google Analytics 报告 API - 权限不足 403

    我正在尝试从谷歌分析访问数据 我按照指南进行操作 并且能够对我的用户进行授权并从 oauth 获取代码 当我尝试从 GA 访问数据时 我只得到 403 权限不足 我是否必须以某种方式将 Google API 控制台中的项目连接到我的分析项目
  • Django 中最干净、最容易运行的日期选择器是什么?

    我喜欢索伯时间表日期选择器 但它是一个日期时间选择器 我无法让它只执行日期 有没有关于漂亮的日期选择器的建议 以及如何与 Django 日期表单字段集成的说明 以下是我所做的 根本没有外部依赖 模型 py from django db im
  • BrowserExtension webRequest.onBeforeRequest 返回承诺

    我在 Chrome 和 FireFox 扩展程序中有以下内容 function webListener requestDetails var asyncCancel new Promise resolve reject gt resolve
  • 如何从 CPU 访问计算着色器本地工作组的大小?

    给定一个计算着色器 我将每个维度的局部大小设置为值 x y 和 z 有什么方法可以让我从 C 代码访问该信息吗 IE Pseudo Code c int size 3 x get local sizes from linked comput
  • 用户控件调整大小[重复]

    这个问题在这里已经有答案了 可能的重复 用户控件的 ResizeEnd 等效项 我觉得自己很愚蠢 但我找不到解决我认为很容易的问题的方法 我有一个用户控件 基本上 显示在绘制期间绘制的图像onPaint stage protected ov
  • 使用两个适配器进行垂直和水平交换

    所以基本上我正在尝试让我的应用程序像 snapchat 一样 你可以向左 向右 向上和向下滑动 我的问题是 该应用程序没有意识到有两个适配器 只能工作一个或其中一个 垂直或水平 我该如何制作 以便我可以在我的设备上垂直和水平滑动 空片段 我
  • 如何在android中拖放到放置位置并从dragview中删除项目

    MainActivity java public class MainActivity extends AppCompatActivity implements View OnDragListener private ListView mL
  • 如何使用 ImageWriter 和 ImageIO 在 Java 中编码动画 GIF?

    我查遍了所有地方 但似乎找不到任何易于理解的解释 我发现其他 Java 用户编写的类和方法可以做到这一点 但我希望自己编写 这里是createImage 的方法GIFanim 也许这会给你一个开始 public byte createIma
  • Partitioned Job 完成后无法自行停止?春季批次

    我编写了一个包含两个步骤的作业 其中两个步骤之一是分区步骤 分区步骤使用 TaskExecutorPartitionHandler 并在线程中运行 5 个从属步骤 该作业在 main 方法中启动 但在每个从属 ItemReader 返回 n
  • PHP 检测特殊字符

    我正在尝试检查字符串是否包含任何特殊字符 以便我知道之后在脚本中如何处理它 这是我所拥有的 if preg match A Z0 9 lt gt X n r message 但是我收到以下错误syntax error unexpected
  • 如何在没有 access_token 的情况下显示来自我的网站的 Facebook feed 消息?

    我有一个 Facebook 网站 网站 不是个人资料墙 并且想在网页上显示消息源 如果我使用的话这已经可以正常工作了 https graph facebook com 177610425663218 feed 但我需要一个 access t
  • Rails cancan 和状态机 - 授权状态

    我最近在我的 Rails 应用程序中使用了两个很棒的 gem state machine 和 cancan 但我很好奇如何干净地集成它们 目前 我已将状态转换放置在执行控制器授权的操作的按钮上 这非常有效 我可以限制谁可以执行该操作 我还想
  • 将 Sparklyr 的 结果拆分为 Spark 对象

    我在分割 Sparklyr 生成的随机森林的结果时遇到问题 我使用以下代码生成一个模型 该模型预测 0 1 评估并预测指定验证集的结果 model lt ml random forest tbl sc train set formulea
  • 将相同键的值合并到字典列表中

    我有以下格式的字典列表 foo a x b y c z a j c z 我想将这个字典列表分组到一个字典中 例如 bar a x j b y None c z z 我目前所做的是循环遍历所有字典foo并创建一个键列表 然后再次循环创建bar
  • 如何有效地将几个字节转换为一个范围之间的整数?

    我正在写一些读取字节的东西 只是一个List