如何生成随机的正数或负数小数?

7
我该如何使用php的rand()函数或其他方法生成-0.0010至0.0010之间的随机小数?

那不仅仅是21个数字的空间吗? - Fosco
6
@Fosco 这是一个无限数字的空间。 - Maerlyn
6个回答

8

rand()除以最大的随机数,乘以范围并加上起始数字:

<?php
  // rand()/getrandmax() gives a float number between 0 and 1
  // if you multiply it by 0.002 you'll get a number between 0 and 0.002
  // add the starting number -0.001 and you'll get a number between -0.001 and 0.001

  echo rand()/getrandmax()*0.002-0.001;
?>

嗨,Harmen,不知道你的公式出了什么问题,我在那里发现了一个错误。它生成了一个负2.加值..你有任何想法吗?谢谢。 - davidlee
我想你找到了一个接近于零的数字,比如“-4.7090060121464E-5”。它意味着“-4.7*10^-5”,即“-0.000047”。 - Harmen

3

.

$val = (rand(0,20)-10)/10000;

现在你只有21个可能的值可供选择。但也许这正是benmsia想要的... - VolkerK
是的。谢谢。虽然生成更多的值会更好,但如果没有有效的解决方案,那么我将暂时坚持这个方案,直到找到新的解决方案。谢谢Nathan。 - davidlee

2

这里使用了两个rand()函数,但我认为它的可读性十分重要。第一部分会产生-1或+1。第二部分可以是0到正负数限制之间的任何数字。

$rand = (rand(0,1)*2-1)*rand(0, 100);
echo $rand;

除非您需要在一个巨大的循环中使用大量随机数,否则您可能甚至不会注意到速度差异。我进行了一些测试(50,000次迭代),通过我的函数获取一个随机数需要约0.0004毫秒。其他替代方案时间大约为其一半,但是再次强调,除非您处于一个真正大的循环中,否则您可能更好地在其他地方进行优化。

速度测试代码:

$start = microtime();
$loopCount = 50000;
for($i=0;$i<$loopCount;$i++)
{
    (0*2-1)*rand(0, 100);
}
$end = microtime();

echo "Timing: ", ((($end-$start)*1000.0)/((float)$loopCount)), " milliseconds.";

0
这将返回在-0.001+0.001之间的任何可能数字。
$random = ((rand()*(0.002/getrandmax()))-0.001)
// or without paranthesis:
$random = rand()*0.002/getrandmax()-0.001

你不需要这么多的括号。 - Harmen
2
是的,当然可以,但它们也不会造成任何伤害。 - jigfox
你好,感谢您的输入。但是由于未知原因,它生成了一个负2.加值。您有任何想法吗? - davidlee
你说的“负2加值”是什么意思? - jigfox

0
$randselect=rand(0,(array_sum($adarray)*100000000));
$cumilativevalue=0;
foreach ($adarray as $key => $value) {
$cumilativevalue=$cumilativevalue+$value*100000000;
    if($randselect<$cumilativevalue){$selectedad=$key;break;}
}

0

生成-1到1之间的一位小数随机浮点数

$random = round((rand(0,1) - floatVal('0.'.rand(0,9).rand(0,9))), 1);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接