我们可以使用简单的转换创建一个随机的 uint8_ 数字吗?

use*_*894 5 c

在我的计算中,函数 rand(); 在C语言中输出一个32位数字。

下面的代码会生成一个随机的 uint_8 数吗?或者它可以依赖于平台?

uint8_t var=(uint8_t) rand();
Run Code Online (Sandbox Code Playgroud)

由于计算模数的时间复杂度,我不想使用模运算。

dbu*_*ush 5

这段代码确实会将 的返回值转换rand为 类型的值uint8_t。该转换实际上是通过截断除最低 8 位之外的所有位来进行的。

就使用模运算符而言,大多数编译器都足够聪明,可以将模2 n转换为按位 AND 并使用设置了n 个低位的值。

请注意,对于简单用途来说,这很好,但是如果您想生成适合加密目的的随机数,或者如果您想确保更好的随机分布,则应该使用加密库(例如 OpenSSL)而不是该函数rand


P__*_*J__ 5

由于计算模数的时间复杂度,我不想使用模运算。

现代编译器足够聪明,当不是绝对必要时不会使用除法。

以下所有内容都会产生相同的生成代码:

uint8_t foo(void)
{
    return rand();
}

uint8_t foo1(void)
{
    return (uint8_t)rand();
}

uint8_t foo2(void)
{
    return rand() % 0x100;
}

uint8_t foo3(void)
{
    return rand() & 0xff;
}
Run Code Online (Sandbox Code Playgroud)

以及生成的代码:

foo():
        sub     rsp, 8
        call    rand
        add     rsp, 8
        ret
foo1():
        sub     rsp, 8
        call    rand
        add     rsp, 8
        ret
foo2():
        sub     rsp, 8
        call    rand
        add     rsp, 8
        ret
foo3():
        sub     rsp, 8
        call    rand
        add     rsp, 8
        ret
Run Code Online (Sandbox Code Playgroud)