生成一个随机数,但有一个转折

Generating a random number but with a twist

提问人:RobertPitt 提问时间:7/3/2010 最后编辑:easweeRobertPitt 更新时间:1/6/2015 访问量:523

问:

我需要生成一个随机数。

但转折点是,较低数字的百分比应该大于较高数字的百分比。

例如。

兰特 > 1 到 100

13、151216 票价:87、1527、12、112、 98、12、 53、1214....

粗体整数将从 1-100 范围内返回。

数学应该是这样的rand = a number lower than max/2

希望你们能帮上忙。

Ps,矩阵怎么会进来?我在数学方面并不出色:(


腹肌的答案似乎就是那个。

$up = $down = 0;
while(true)
{
   if(abs((rand()%150)-50) < 50)
   {
      $up++;
   }else
   {
      $down++;
   }
   if( ($up + $down) == 500){ break;}
}

echo $up . '/' . $down;
PHP 随机

评论

4赞 kennytm 7/3/2010
你到底想要什么样的分布?
0赞 Thomas 7/3/2010
您需要确定所需的特定分布。你所说的“数学”是错误的,因为并非你示例中的所有数字都低于 max/2 = 100/2 = 50。
0赞 RobertPitt 7/3/2010
我的例子是表明 0-100,粗体 ints 是将返回的 ints。我不确定你在这件事上的分配是什么意思?
0赞 salathe 7/3/2010
为什么还不够?$one_to_this=100; $rand=mt_rand(1,$one_to_this/2);
0赞 Frank Farmer 7/3/2010
最后,了解 1d100、5d20 和 10d10 之间的区别是值得的。嗯,不是真的。这些只是改变了对中位数的偏差,而不是 OP 所希望的第一/第二四分位数。

答:

5赞 KenE 7/3/2010 #1

怎么样

n = abs((rand()%150)-50)
3赞 mario 7/3/2010 #2
$x = rand(0,1) ? rand(1,100) : rand(1,50);

简单方法:第一个 rand(0,1) 在两种情况之间进行选择。1..50 或 1..100 作为随机范围。由于 1,100 已经包含 1,50,因此 100% 的时间选择后一个范围,前一种情况仅在 2 次运行中的 1 次中。

如果你想要一个分布,其中最高的数字 99 几乎从不被选中,但较低的数字 1..20 非常频繁,那么一个简单的就可以了。rand(1,rand(1,100))

评论

0赞 RobertPitt 7/3/2010
我认为这与 odss 相同,在我的测试用例中,它们平均为 45-55。:(
0赞 JSBձոգչ 7/3/2010 #3
$rand = (rand() * rand()) / (getrandmax() * getrandmax());

这将为您提供一个介于 0 和 1 之间的随机数,很有可能落入该范围的下限,并且较大数字呈指数递减的概率。然后,您可以将此结果缩放到所需的任何范围。