PHP 乱数产生介於 0 到 1 之间的浮点数

前言

有一次在串接合作厂商的 API 时,需要把他原本取 token 的 javascript 改写成 PHP 版;其中有一个步骤需要用 PHP 产生介於 0 到 1 之间的浮点数,看似简单却卡了我一阵子。

原因是 PHP 似乎没有提供一个函式可以直接做到(有的话请告诉我>_<)

rand()

PHP 提供的乱数函式,会回传一个整数,可以给订一个范围

rand(0,15); // 0 <= output <= 15

如果为给定范围,会回传一个 0 到 RAND_MAX 的随机整数。
而 RAND_MAX 是多少呢?这会根据所使用系统而有所不同,可以透过 getrandmax() 得知。

getrandmax(); // output 2147483647,2的31次方减1,32位元有号整数的最大值

有号整数

0 ~ 1 之间的乱数

实作前要再确认是需求是哪种

  • 0 < output < 1
  • 0 <= output <= 1

可以用rand()除以最大值 RAND_MAX。

rand() / getrandmax(); // 0 <= output <= 1

但这做法理论上会包含 0 和 1,只是机率很小,保守一点可以做排除。

$rand = rand() / getrandmax();
while ($rand == 1 || $rand == 0) {
    $rand = rand() / getrandmax();
}

另外分享一个另类的做法,就是用 sin() ,利用他会回传一个 -1 到 1 浮点数的特性来做,以前做动画常常会用到(茶)
感谢帮友提醒,这方法数值偏两端(0 跟 1)的机率会比中间(0.5)的高

// 确实会产生介於 0 到 1 之间的数,但非平均分布
(sin(rand())+1)/2;

注意,这边 sin() 的输入单位是弧度 (角度转弧度)


<<:  Day1为什麽要做网站勒?

>>:  Day_01: 让 Vite 来开启你的Vue 前言

Day 47. build a ios app in unity

我决定试试看做个简单的手机游戏,先把最重要的build流程理顺了,再来决定怎麽开发。 这次一样有参考...

Day7-TypeScript(TS)基础型别资料Part 2

今天要接续昨天的继续介绍基础资料型别,如下 Enum 型别 Null 型别 Undefined 型别...

EC的农地辣麽大,作物辣麽多,来认真找作物了(2)ES的逐一说文解字-Range & 常用的旁支末节

来到了倒数第二天 真是快被榨乾了呢(还真是没料 (┐「﹃゚。)) 但说好写三十篇技术文就是要灌满三十...

[Day13] 前往Actions On Google平台试用

接续昨日的DialogFlow对话流设计後, 现在你已经拥有了一个能执行的语音应用程序! 接下来,...

【Day 3】Git与Github入门

Git与Github关系? 说明 : Github是Git进行版本控制软件的服务平台供应商之一。 G...