我有一个名为myrand()
的函数,它生成从1到5的随机数。我想通过使用myrand()
生成另一个函数,它将生成从1到7的随机数。我写了类似的东西
function newrand() {
return myrand()+2;
}
以上逻辑不是我想要它永远不会返回我1或2.我不想使用任何if条件所以我该怎么做才能为随机数制作逻辑。
答案 0 :(得分:1)
在PHP中有一个名为rand()
的函数来执行此操作。请尝试以下代码:
function newrand() {
return rand(1, 7);
}
或者让我们说myrand()
就像下面的代码:
function myrand() { return rand(1,5); }
您可以做的是,将上限传递给myrand()
myrand(5)
和myrand(7)
而不是myrand() + 2
。如下:
myrand($max) {
return rand(1, $max);
}
并将其称为:
function newrand() {
return myrand(7);
}
答案 1 :(得分:0)
当您编写某种rand()
函数时,考虑二进制数表示而不仅仅是常规数字会更好。
例如,要获得0到7范围内的随机数,您必须得到3位的相等分布。
000 # 0
001 # 1
010 # 2
...
111 # 7
如果您可以将myrand()
视为以相等概率产生1到5的数字的函数,那么您可以通过组合rand()
生成的前2位来构造任何myrand()
函数调用
func rand_bits_2() { return (myrand() - 1) & 0b11; }
func rand_bits_4() {
hi = rand_bits_2() << 2; // first 2 random bits
lo = rand_bits_2(); // consecutive 2 random bits
return hi | lo;
}
4个随机位产生0到15之间的数字。进一步考虑这个想法,你可以得到例如myrand7()
。
UPD:您可以找到更多here。
答案 2 :(得分:0)
假设您的函数统一生成1
和5
之间的数字。要在1
和7
之间统一生成数字,请执行以下操作:
生成7
随机数
x1 ... x7
1
和5
之间
计算样本总和
s = x1 + x2 + ... + x7
<强>返回强>
(s - 7 mod 7)+ 1
其中(s - 7 mod 7)
是s - 7
7
整数除法的非负提醒。
以下是我在生成100000
个样本重复上述3个步骤之后获得的随机频率的示例:
1 -> 14331
2 -> 14447
3 -> 14489
4 -> 14095
5 -> 14293
6 -> 14157
7 -> 14188
,正如您所看到的,看起来非常均匀。