在保持公平分配的同时从/ dev / urandom范围内获取字节

我想要在程序集(nasm,linux)中生成随机数字,而且我不想使用libc(出于教学原因),所以我打算读取/ dev / urandom。

事情是,我希望他们在一个特定的范围内。

比如说,我想要一个从0到99的数字。

当我从/ dev / urandom读取一个字节时,它将会在0x00到0xff(255)的范围内。

我能做的一件事是应用一个mod 100,这将保证正确的范围。

但是这种方法的问题是有些数字比其他数字有更多的机会出来。

51号将从3个不同的结果出来:

51 % 100 = 51 151 % 100 = 51 251 % 100 = 51 

数字99只会来自两个不同的结果:

 99 % 100 = 99 199 % 100 = 99 (there will be no 299 since the range of a byte ends in 255). 

我提出的唯一解决scheme是在200-255范围内随机抽取数字,然后读取另一个数字。

有一个更聪明的方法来读取一个随机字节,并确保它是在一定范围内,而“公正”?

如果我打算读取一定范围内的大量字节呢? 有没有公​​平的方式去公平的读取?

我听说getr​​andom(2)linux系统调用,但它还没有在一个稳定的内核(到目前为止是3.16.3)。 有其他select吗?