python代码如下(以1-10的随机数为例)
# 生产1-7随机均匀分布的整数
def rand7():
return random.randint(1,7)
# 生产随机数1-6的随机数
def rand6():
while 1:
x=rand7()
if x != 7:
return x
# 生产1-10随机均匀分布的整数
def rand10():
while 1:
y = (rand6()&1)<<3|rand6()&1<<2|rand6()&1<<1|rand6()&1
if y < 11 and y >0:
return y
思路:生产随机均匀的1和0,并将生成的0和1拼接为一个二进制数,拼接的位数转化为十进制要大于X,由于1和0是随机均匀分布的,这样拼接成的数字都会均匀的出现,过滤出其中任意几个数字,都是均匀随机分布的
1、为什么要把1-7的整数先变为1-6呢?
1-7的整数与1 做&操作,生成的0和1是不均匀的,三个0,四个1,不是均匀的。
2、注意事项, 与运算的优先级比位移运算等级高,在于1与运算外面一定要加括号,
运算符说明 | Python运算符 | 优先级 | 结合性 |
---|---|---|---|
小括号 | ( ) | 19 | 无 高 |
索引运算符 | x[i] 或 x[i1: i2 [:i3]] | 18 | 左 |
属性访问 | x.attribute | 17 | 左 |
乘方 | ** | 16 | 左 |
按位取反 | ~ | 15 | 右 |
符号运算符 | +(正号)、-(负号) | 14 | 右 |
乘除 | *、/、//、% | 13 | 左 |
加减 | +、- | 12 | 左 |
位移 | >>、<< | 11 | 左 |
按位与 | & | 10 | 右 |
按位异或 | ^ | 9 | 左 |
按位或 | 安位或 | 8 | 左 |
比较运算符 | ==、!=、>、>=、<、<= | 7 | 左 |
is 运算符 | is、is not | 6 | 左 |
in 运算符 | in、not in | 5 | 左 |
逻辑非 | not | 4 | 右 |
逻辑与 | and | 3 | 左 |
逻辑或 | or | 2 | 左 |
逗号运算符 | exp1, exp2 | 1 | 左 |