- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的嵌入式项目中,我有一个处理任意长度整数的 biginteger 类。我希望能够生成一个介于 0 和任意数字之间的随机 bigint。假设我有一个高质量的随机字节源。
我见过的所有实现基本上都做同样的事情:
我看到这个实现的问题是它可能需要很长时间。想象一下 max = 2^2049-1
=( 01 FF .. FF
)。该算法将生成 257 个字节,然后检查最高有效字节是 <=1
.所以它有 254/256 的机会生成一个全新的 257 字节数字。在(诚然不太可能)最坏的情况下,此循环可能会持续几分钟或几年。
我的问题是:
在生成的数字太大的情况下,有没有办法保留我已经生成的大部分字节?
仅重新生成最高有效字节是否有效,还是会引入偏差?将结果右移一位怎么样?
有什么方法可以使时间具有确定性,同时仍能避免偏差?
--
另一个极端情况:max = 2^2048 + 1
= ( 01 00 .. 01
) 在这种情况下,如果其余字节为 0 后跟 00
,则最高有效字节可以为非零字节或 01
.所以大多数时候,如果 MSB 不为零,那么它将无效,并且仅仅重新生成该字节永远不会使其有效。但仅仅强制将其设置为零似乎也是错误的。
最佳答案
答案是一般不可能在常数时间内生成[0, n
) 中的随机无偏整数。一个值得注意的异常(exception)是当随机数源产生无偏随机位并且 n
是 2 的幂时。
例如,假设我们有一个“真正的”随机生成器并且可以生成无偏随机位。然后,除非 n
是 2 的幂,否则只有两种可能的方法进行:
n
不是 2 的幂,这是必需的),以及 Fast Dice Roller (使用随机位)。(请参阅我关于 integer generating algorithms 的注释以了解对这两种算法的调查。对于 Fast Dice Roller 实现,请参阅 another answer of mine。)
从这个意义上讲,Knuth 和 Yao 在 1976 年表明,任何仅使用随机位生成具有给定概率的随机整数的算法都可以表示为二叉树,其中随机位指示遍历树的方式和每个叶(端点)对应于一个结果。 (Knuth 和 Yao,“非均匀随机数生成的复杂性”,算法和复杂性,1976 年。)在这种情况下,[0, n) 中的每个整数都可以以 1/n 的概率出现。如果 1/n 有一个不终止的二进制扩展(如果 n
不是 2 的幂就是这种情况),这个二叉树必然是——
无论哪种情况,算法都不会在恒定时间内运行。
模数或类似的归约等同于二叉树,其中拒绝叶被标记的结果替换——但由于可能的结果比拒绝叶多,所以只有部分结果可以代替拒绝叶,从而引入偏差.如果您在一定次数的迭代后停止拒绝,则会产生相同类型的二叉树和相同类型的偏差。 (另请参阅 L. Devroye 于 1986 年出版的 Non-Uniform Random Variate Generation 的第 15 章。)
因此:一般来说,整数生成器可以是无偏或恒定时间的,但不能两者兼而有之。
如果您不能容忍永远运行的最坏情况,那么您唯一能做的就是设置一个固定的最大拒绝次数或使用减少次数,这两者都会引入偏差。但是,根据您的应用程序,这种偏差可能可以忽略不计(例如,如果算法“失败”的可能性与其“成功”的可能性相比可以忽略不计,对于应用程序的目的)。随机整数生成也有安全方面的问题,这些问题太复杂了,无法在此答案中讨论。
关于random - 如何在恒定时间内生成无偏随机 bigint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33288102/
我正在使用 gmp 执行复杂的操作。我想使用 Botan 来执行加密功能。问题是他们都有自己的 Bigint 函数。因此,在将 gmp 函数中使用的 bigint 值提供给 Botan 函数时会产生问
我正在尝试运行查询: let query = ` DELETE FROM ${table_name} WHERE
我有以下代码片段: use num_bigint::*; // 0.2.2 use num_traits::*; // 0.2.8 use std::ops::*; fn xgcd(b: &BigIn
我有一个 Postgres 8.2 表,其中列定义为 bigint 数据类型。 当我执行 sum(column) 时,返回类型是 numeric。我想强制将总和类型转换为 bigint,因为我确信结果
我有这样一个场景: CREATE TABLE `Users` ( `IdUser` bigint(20) NOT NULL PRIMARY KEY ) ENGINE=InnoDB DEFAULT
我想遍历一系列具有 BigUint 类型的值(来自 num crate )。 我该怎么做? 我试过了 for i in 0..a {...} 其中 a 是(借用的)BigUint 类型。我收到有关不匹
环境: Ubuntu 14.04 MySql 工作台 6.2.4 MariaDB 10 当我尝试将模型与数据库模式同步时,我已经在一个表中定义了 UNSIGNED BIGINT 类型(即 UNSIGN
我正在使用一个列来存储 UNIX 时间戳以秒为单位(除以 1000)。我发现 bigint 数据类型足以存储它。我使用 创建了它 ... createTimeStamp bigint, ...
我假设一种语言的实现允许您将指针视为整数,包括对它们进行标准算术。如果由于硬件限制这是不现实的,请告诉我。如果编程语言通常没有这么强大的指针运算,但是在实践中是可行的,那么我仍然想知道这种实现BigI
我正在尝试使用 Spark 将数据从 greenplum 移动到 HDFS。我可以从源表中成功读取数据,数据框(greenplum 表)的 spark 推断模式是: 数据框架构: je_header
我有一个表名称file_upload它的 upload_id 列为 BIGINT(11) AI PK NOT NULL当我将表列大小更改为 BIGINT(20) 时,AI 标志被删除,每次更改列中的任
我必须将一些加密代码从我不太熟悉的 java (visual c++) 移植到 visual c++。我在 http://sourceforge.net/projects/cpp-bigint/ 找到
我正在尝试对任意大整数实现 Solovoy-Strassen 素性检验。我还将编写一个 bignum(不能使用第 3 方实现,因为这是一个学术项目)。我已经决定了 bignum 的以下结构: stru
我有两个模型(商店和产品),两者的主键都是 BigInt,但产品(store_id)中的关系列仍然是整数。我不想使用原始 SQL,如何使用 Django 解决此问题? 例子: class Produc
有没有办法得到 BigInt 的对数?在 JavaScript 中? 对于普通数字,您将使用以下代码: const largeNumber = 1000; const result = Math.lo
在我的嵌入式项目中,我有一个处理任意长度整数的 biginteger 类。我希望能够生成一个介于 0 和任意数字之间的随机 bigint。假设我有一个高质量的随机字节源。 我见过的所有实现基本上都做同
我有一个 pandas pyspark 中的数据框.我想将此数据框创建/加载到 hive table 。 pd_df = pandas data frame id
有没有办法获得可以存储在 bigint 中的最大值,而无需对其进行硬编码? 是否有返回/包含此值的函数或常量? 最佳答案 请参阅 this similar question 中提供的答案.据我所知,没
我正在使用 Chapel,我正在尝试对 bigint 执行计算多语言环境设置中的数组。读取每行包含一个整数的文件。每行转换为 bigint记录然后插入到单个数组中。我有 4 个语言环境,因此我要求每个
我有一个存储过程,它必须返回一个 bigint 作为输出。下面如果定义。 在正文中,我在表中插入一行并在 @LogID 输出变量中使用 @@Identity 返回标识。 除返回部分外,一切正常。我试过
我是一名优秀的程序员,十分优秀!