在 ARMv8 程序集中将范围限制在 0 到 9 之间的随机数是啥?

Posted

技术标签:

【中文标题】在 ARMv8 程序集中将范围限制在 0 到 9 之间的随机数是啥?【英文标题】:What to and a random number with to constrain range between 0 to 9 in ARMv8 Assembly?在 ARMv8 程序集中将范围限制在 0 到 9 之间的随机数是什么? 【发布时间】:2020-06-08 23:39:47 【问题描述】:

我正在尝试在 ARMv8 中创建一个随机数数组。

我成功地创建了一个随机数数组,但是,我的指令限制了数组;特别是 and 指令和 cmp 将其限制在 0 到 12 而不是 0 到 9 的范围内。

这是我的代码:

bl   rand               //branch to random num
and  x22, x0, 0x0C      
add x18,x18, x22        
cmp x22,x23             //compare x23 register to x22
b.lt mini               //branch to minimum calculation

如您所见,我正在使用 x0 和 0x0C,即十六进制的 12。

有人说最好的方法是使用 0xFF 或 255 十六进制,但这给了我非常大的数字,因此 Ox0C 给了我迄今为止最好的结果,但并不理想,因为我需要它们在 0 到 9 之间。

运行程序时我目前得到的示例表:

0 0 0 8 0
12 8 12 4 12
4 4 0 4 12
4 12 12 12 4
12 8 8 8 4

以及理想的表格示例(我只是从 12 中删除了 1 或 2 来演示个位数的随机表格,这不是实际的生成):

0 0 0 8 0
2 8 1 4 2
4 4 0 4 1
4 1 1 2 4
1 8 8 8 4

【问题讨论】:

0xc 是 12 而不是 13。您也不能将 and 用于 0-9。您可以改用除法余数。 @Jester 是一个错字,已修复。我之前尝试过使用除法余数,但被告知使用按位计算结果更好。 按位 and 使用 2 的幂。如果您很高兴拥有0-70-9 中的任何8 个值(意味着您省略了您选择的2 个数字),您可以使用它。 因为我们看不到其余的代码,这不是一个正确的陈述, cmp 本身不会约束它你需要循环。如果 rand 产生一个 32 位数字,那么 99.99999998% 的时间它将比较失败。 @mikejosnton,除非您知道生成器是高质量的,否则使用模运算符来减少随机数生成器的范围是有风险的。例如,一种流行的 RNG 生成在偶数和奇数之间交替的数字。如果你使用mod 2 得到一个0 或1 的数字,它就会变成0 和1 的交替序列。 【参考方案1】:

仅使用and 无法完成。 1、2、4 和 8 的位模式是

0b0001
0b0010
0b0100
0b1000

唯一允许所有这些值的位掩码是 0b1111,它允许最大为 15 的任何数字。如果要将值限制在 0-9 范围内,您有两个基本选项:

    您可以使用整数除法来减小具有较大范围的生成器的范围。这往往会对某些数字产生轻微的偏差。 您可以使用and 的位掩码0x0f 将范围缩小到0-15。如果数字大于 9,则丢弃它并生成一个新的随机数。这是公正的,但无法保证生成可接受的数字需要多长时间。

【讨论】:

以上是关于在 ARMv8 程序集中将范围限制在 0 到 9 之间的随机数是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 NEON armv8 程序集中存储指令

当我尝试在 Armv8 程序集中分配数组时执行冻结

ARMv8 程序集,如何将值从 w 寄存器移动到 x 寄存器?

在C#中怎么用正则表达式限制文本框内不能输入数字?

限制引导程序样式的范围

使用正则表达式验证掩码和货币的限制范围