在 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-7
或0-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 之间的随机数是啥?的主要内容,如果未能解决你的问题,请参考以下文章