将整数转换为随机但确定性可重复的选择

2024-01-07

如何将无符号整数(表示用户 ID)转换为看起来随机但实际上是确定性可重复的选择?必须以相等的概率选择该选项(无论输入整数的分布如何)。例如,如果我有 3 个选择,即[0, 1, 2]例如,用户ID 123可以总是被随机分配选择2,而用户ID 234可以总是被分配选择1。

跨语言和跨平台的算法再现性是可取的。我倾向于使用哈希函数和模,除非有更好的方法。这是我所拥有的:

>>> num_choices = 3
>>> id_num = 123
>>> int(hashlib.sha256(str(id_num).encode()).hexdigest(), 16) % num_choices
2

我正在使用最新的稳定Python 3。请注意,这个问题与相关问题类似但不完全相同将字符串转换为随机但确定性可重复的均匀概率 https://stackoverflow.com/questions/44556105/convert-string-to-random-but-deterministically-repeatable-uniform-probability.


使用哈希和模数

import hashlib

def id_to_choice(id_num, num_choices):
    id_bytes = id_num.to_bytes((id_num.bit_length() + 7) // 8, 'big')
    id_hash = hashlib.sha512(id_bytes)
    id_hash_int = int.from_bytes(id_hash.digest(), 'big')  # Uses explicit byteorder for system-agnostic reproducibility
    choice = id_hash_int % num_choices  # Use with small num_choices only
    return choice

>>> id_to_choice(123, 3)
0
>>> id_to_choice(456, 3)
1

Notes:

  • 内置的hash https://docs.python.org/3/reference/datamodel.html#object.__hash__不得使用该方法,因为它可以保留输入的 分布,例如和hash(123)。或者,它可以在 Python 重新启动时返回不同的值,例如和hash('123').

  • 要将 int 转换为字节,bytes(id_num)可以工作,但效率非常低,因为它返回一个空字节数组,因此不能使用它。使用int.to_bytes https://docs.python.org/library/stdtypes.html#int.to_bytes更好。使用str(id_num).encode()有效但浪费了一些字节。

  • 诚然,使用模并不能提供完全一致的概率,[1] https://stackoverflow.com/questions/13104478/uniformity-of-random-numbers-taken-modulo-n[2] https://stackoverflow.com/questions/10984974/why-do-people-say-there-is-modulo-bias-when-using-a-random-number-generator但这对于这个应用程序来说应该不会有太大偏差,因为id_hash_int预计会非常大并且num_choices被假定为很小。

使用随机

The random https://docs.python.org/library/random.html模块可与id_num作为其种子,同时解决围绕两者的担忧线程安全 https://stackoverflow.com/questions/10021882/make-the-random-module-thread-safe-in-python和连续性。使用randrange这种方式与散列种子和取模相当并且更简单。

使用这种方法,不仅需要考虑跨语言的可重复性,而且跨多个未来版本的 Python 的可重复性也可能是一个问题。因此不建议这样做。

import random

def id_to_choice(id_num, num_choices):
    localrandom = random.Random(id_num)
    choice = localrandom.randrange(num_choices)
    return choice

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

将整数转换为随机但确定性可重复的选择 的相关文章

  • AttributeError:'function'对象在pandas中没有属性'bar'

    我有一个 pandas 数据框 它是 pandas 数据框类型 如下所示 type df Out 176 pandas core frame DataFrame 但是 当我尝试在此数据框上使用任何绘图函数 如条形图 时 会出现如下错误 df
  • 如何在 QTableView 标题中单击鼠标右键单击上下文菜单?

    下面的示例代码 很大程度上受到here http www saltycrane com blog 2007 12 pyqt 43 qtableview qabstracttablemodel 有一个右键单击上下文菜单 当用户单击表中的单元格
  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • 如何在seaborn热图标签中使用科学计数法?

    我正在尝试在 python 中使用seaborn 获取热图 不幸的是 即使数字非常大 它也没有使用科学记数法 我想知道是否有任何简单的方法可以转换为科学记数法或任何其他合理的格式 这是显示问题的一段代码 import seaborn as
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 在 PhotoImage 下调整图像大小

    我需要调整图像大小 但我想避免使用 PIL 因为我无法使其在 OS X 下工作 不要问我为什么 无论如何 因为我对 gif pgm ppm 感到满意 所以 PhotoImage 类对我来说没问题 photoImg PhotoImage fi
  • 如何将 numpy rearray 的子集转换为连续数组?

    我有一个recarray来自读取 csv 文件 我有兴趣将列的子集转换为连续浮点数组 我想避免将它们转换为列表或将它们一一堆叠 我尝试了中的建议https stackoverflow com a 11792956 https stackov
  • 如何在 numpy 数组中查找并保存重复的行?

    我有一个数组 例如 Array 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 2 2 2 我想要输出以下内容的东西 Repeated 1 1 1 2 2 2 保留重复行的数量也可以 例如 Repeated 1 1
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 在 C# 中生成随机浮点数的最佳方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 C 中生成随机浮点数的最佳方法是什么 更新 我想要从 float Minvalue 到 float Maxvalue 的随机浮点数 我在一些
  • 无法将matplotlib安装到pycharm

    我最近开始使用Python速成课程学习Python编程 我陷入困境 因为我无法让 matplotlib 在 pycharm 中工作 我已经安装了pip 我已经通过命令提示符使用 pip 安装了 matplotlib 现在 当我打开 pych
  • 更改用作函数全局作用域的字典

    我想做一个 purePython 的装饰器 其中一部分是能够有选择地禁止访问函数的全局范围 有没有一种方法可以以编程方式更改哪个字典事物充当函数的全局 外部作用域 因此 例如在下面我希望能够拦截对f in h并抛出错误 但我想允许访问g因为
  • 使用 Sphinx 时,如何记录没有文档字符串的成员?

    我正在为我发布的包编写文档 我发现您的文档越全面 人们就越容易找到您的包来使用 废话 实际上 我在充满爱心地编写代码的所有功能和细节方面获得了很多乐趣 然而 我对如何为类级变量编写与 Sphinx 兼容的文档感到完全困惑 特别是 我有一些e
  • 如何使用logging.conf文件使用RotatingFileHandler将所有内容记录到文件中?

    我正在尝试使用RotatingHandler用于 Python 中的日志记录目的 我将备份文件保留为 500 个 这意味着我猜它将创建最多 500 个文件 并且我设置的大小是 2000 字节 不确定建议的大小限制是多少 如果我运行下面的代码
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构

随机推荐

  • 使用 python 对点进行排序以获得连续曲线

    我有一个未排序点的列表 列表 50 6261 74 3683 63 2489 75 0038 76 0384 75 6219 79 8451 75 7855 30 9626 168 085 27 381 170 967 22 9191 17
  • PyCharm 中 Python 控制台和终端的区别

    我是 Python 初学者 我最近开始使用 PyCharm 但我不知道终端和控制台有什么区别 终端中的某些命令在控制台中不起作用 在讨论差异之前 我们需要先谈谈两者在实践中的区别 终端本质上取代了 Windows 上的命令提示符 电源外壳和
  • MinGW 错误:“线程”不是“std”的成员

    我正在尝试为 Windows 交叉编译一个简单的应用程序 include
  • 为什么gmtime要这样实现呢?

    我偶然发现了 Minix 的 gmtime 函数的源代码 我对从纪元以来的天数计算年份数的位感兴趣 以下是该部分的内容 http www raspberryginger com jbailey minix html gmtime 8c so
  • 通过 COM 将 DataTable 传递到 R

    我试图将数据从 SQL 传递到 C 然后传递到 R 服务器进行数据分析 然后返回到我的 Web 应用程序 但是 我使用的 COM 接口不允许在 C 和 R 之间传递复杂的数据类型 无数据表 我过去使用以下代码让它工作 int count d
  • NSTask 阻塞主线程

    我正在使用 NSTask 但是当我启动任务时 它会阻塞主线程 因此我无法更新它 直到任务结束 这是我的代码 NSString hostsforping google es pingdata NSTask alloc init pingdat
  • 使用 ListFragment 填充自定义视图列表

    我正在尝试使用片段在列表视图中显示元素 我创建了自定义视图 如下所示 list row xml 的图形表示 列表行 xml
  • 如何恢复过期的令牌[AWS Cognito]?

    我的网站使用 AWS 1 小时后 令牌就会过期 用户几乎无法执行任何操作 现在我正在尝试像这样刷新凭据 function getTokens session return accessToken session getAccessToken
  • 身份服务器单点注销,也从服务器注销

    这是我在依赖方中使用的注销代码 FederationConfiguration cfg FederatedAuthentication FederationConfiguration var fam FederatedAuthenticat
  • 使用 Marionette.ItemView 获取没有模型的视图?

    是否常规使用Marionette ItemView对于没有特定的视图类model与他们相关的财产 As Marionette View并不意味着可以直接使用 它看起来像一个ItemView作为具有方便的默认值和绑定的视图类是有意义的 或者
  • PHP PDO Sqlsrv 始终以字符串形式返回每个值

    如何从具有正确字段类型的数据库中获取值 我使用 PDO Sqlsrv 从数据库获取数据 并且总是以字符串形式接收数据 如下所示 customer id 1 My customer id字段类型应该是整数customer id 1 But p
  • SQL Server:如何将所有行的数据作为 Json 对象查询到其他列旁边?

    I have data like this I want to query result like this 这是我的代码 SELECT PML CODE PML NAME ENG SELECT PML ID PML NO PML CODE
  • 签入/签出文件时 Sharepoint“不支持的段类型”

    我想使用OneDrive REST API 上的签出 签入功能 https learn microsoft com en us onedrive developer rest api api driveitem checkout https
  • 可以包含 javascript 的 HTML 属性

    我正在寻找一个包含所有 html 属性的简单列表 这些属性可以包含在执行操作时自动运行的 javascript 我知道这在浏览器和版本之间会有所不同 但我宁愿更安全 也不愿后悔 我目前知道以下 javascript 属性 onload on
  • 应用程序因内存问题而终止

    在我的应用程序中 我收到此错误 来自调试器的消息 由于内存问题而终止 并且应用程序崩溃 我正在显示一个网页 但问题是内存使用量不太高 应用程序使用的内存不到 100 MB 仅当我在 iPhone 6 Plus 中运行该应用程序时 该应用程序
  • 单个主机上的多个 glibc 库

    我的 Linux SLES 8 服务器当前有 glibc 2 2 5 235 但我有一个程序无法在此版本上运行并且需要 glibc 2 3 3 是否可以在同一主机上安装多个 glibc 这是我在旧 glibc 上运行程序时遇到的错误 mya
  • 使用 javascript 读取多个同时键盘输入

    我注意到 JavaScript 中键盘输入有一些奇怪的行为 我可能在这里遗漏了一些非常明显的东西 但是是否有某种关于允许同时按下哪些键的规则 我使用布尔变量来保存四个键中每个键的状态 如下所示 这允许同时按下许多键 硬件允许 var up
  • 恢复 Git 存储库中已删除的文件夹

    我已经删除了文件夹中的所有内容 并且该文件夹为空 我的远程仓库中仍然有一份副本 但是当我做了一个git pull它没有放回已删除的文件不是应该这样做吗 所以我做了一些研究 发现你可以通过执行以下操作来恢复文件git checkout
  • 一次读取每个字符 - C

    对于下面的question https users cs cf ac uk Dave Marshall C node7 html SECTION00730000000000000000 练习 12336 从程序的标准输入中一次读取一个字符的
  • 将整数转换为随机但确定性可重复的选择

    如何将无符号整数 表示用户 ID 转换为看起来随机但实际上是确定性可重复的选择 必须以相等的概率选择该选项 无论输入整数的分布如何 例如 如果我有 3 个选择 即 0 1 2 例如 用户ID 123可以总是被随机分配选择2 而用户ID 23