首頁  >  文章  >  後端開發  >  使用 PHP 的內建數學函數探索三角學、隨機數生成等

使用 PHP 的內建數學函數探索三角學、隨機數生成等

WBOY
WBOY原創
2023-09-01 21:33:011086瀏覽

程式設計過程中會大量使用基礎數學。我們在編寫程式碼時需要經常比較、加、乘、減、除不同的值。

有時,程式中所需的數學可能會涉及更多。您可能需要使用對數、三角或指數函數。在本教程中,我將透過範例討論如何在 PHP 中使用每個函數。

本教學將向您介紹 PHP 中用於進行三角、指數和對數計算的內建數學函數。我們還將研究舍入和產生隨機數。

#PHP 中的三角函數

您可以使用sin($angle)cos($angle) 計算以弧度給出的不同角度的正弦、餘弦和正切值,以及tan ($angle).它們都傳回float 值,傳遞給它們的角度測量值以弧度為單位。

這表示當您簡單計算 tan(45) 時,您不會得到 1 作為輸出,因為您實際上將計算 45 弧度處的切線值,約為 2,578度。幸運的是,PHP 有兩個非常有用的函數,用於將弧度轉換為角度,反之亦然。這些函數是 rad2deg()deg2rad()。因此,如果您確實想計算 45 度的正切值,則必須編寫 tan(deg2rad(45))

 值得注意的是,沒有直接的PHP 函數來計算cosec()sec() 的值cot().但是,這些值只是sin()cos()tan() 的倒數,因此您仍然可以計算他們的價值觀間接。

您也可以進行逆運算並計算三角角具有特定值的角度。這些函數稱為 asin()acos()atan()。您必須記住的一件事是,對於任何角度,sin 和 cos 的值都不能超出 -1 到 1 的範圍。這意味著 asin()acos() 只能接受 -1 到 1 範圍內的值作為有效參數。超出此範圍的值將為您提供 NaN。

三角學有很多應用,例如確定彈體的軌跡或不同物體的高度和距離,因此,如果您正在編寫模擬這些情況的程式碼,那麼存取這些函數肯定會很有幫助。

當您想要使用徑向和角度值來繪製不同的元素時,這些函數也非常有用。假設您想以均勻的距離圍繞一個較大的圓繪製一個圓圖案。如果您閱讀 Envato Tuts 上的 PHP GD 形狀教程,您可能還記得繪製任何形狀都需要您以 x、y 座標的形式傳遞座標,但使用極座標繪製圓形圖案會更容易。

在這種情況下使用這些三角函數將幫助您使用 sin()cos() 將極座標轉換為笛卡爾形式來繪製所需的圖形。這是一個例子:

<?php

$image = imagecreatetruecolor(800, 600);
$bg = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg);

$radius = 80;

for($i = 0; $i < 12; $i++) {
    $col_ellipse = imagecolorallocate($image, rand(0, 200), rand(0, 200), rand(0, 200));

    imagefilledellipse($image, 175 + 125*cos(deg2rad($i*30)), 175 + 125*sin(deg2rad($i*30)), 3*$radius/4, 3*$radius/4, $col_ellipse);
    imageellipse($image, 175 + 125*cos(deg2rad($i*30)), 175 + 125*sin(deg2rad($i*30)), 3.5*$radius/4, 3.5*$radius/4, $col_ellipse);

    $col_ellipse = imagecolorallocate($image, rand(0, 200), rand(0, 200), rand(0, 200));

    imagefilledellipse($image, 575 + 150*cos(deg2rad($i*30)), 375 + 150*sin(deg2rad($i*30)), 3*$radius/4, 3*$radius/4, $col_ellipse);
    imageellipse($image, 575 + 150*cos(deg2rad($i*30)), 375 + 150*sin(deg2rad($i*30)), 3.5*$radius/4, 3.5*$radius/4, $col_ellipse);
}

$col_ellipse = imagecolorallocate($image, 255, 255, 255);
imagefilledellipse($image, 175, 175, 275, 275, $col_ellipse);

?>

下圖顯示了上述 PHP 程式碼的最終結果。

使用 PHP 的内置数学函数探索三角学、随机数生成等

指數與對數函數

#PHP 也具有一些指數和對數函數。 exp($value) 函數會傳回常數 e 的 float $value 次方。同樣,您可以使用 log($arg, $base) 函數計算給定數字對任意底數的對數。如果省略 $base ,將使用自然底數 e 計算對數。如果你想計算一個數字以10為底的對數,你可以簡單地使用函數 log10($arg)

您可能會發現另一個有用的函數是pow($base, $exp),它會傳回$base$exp.有些人可能更喜歡使用** 運算子。表達式 $a**$b 將給出與 pow($a, $b) 相同的結果。但是,在某些情況下,使用 $a**$b 可能會得到不正確的結果。例如, -1**0.5 將為您提供 -1,這是不正確的。使用 pow(-1, 0.5) 計算相同的表達式將給出正確的值 NaN。

<?php

echo log(1000, M_E); // 6.9077552789821
echo log(1000); // 6.9077552789821
echo log(1000, 10); // 3
echo log10(1000); // 3

echo pow(121, -121); // 9.6154627930786E-253
echo pow(121, 121); // 1.0399915443694E+252
echo pow(121, 1331); // INF

?>

其他有用的数学函数

四舍五入数字

还有许多其他重要的数学函数。您可以使用 ceil(float $value) 函数将分数或小数四舍五入到最接近的整数。这会将 2.1 和 2.9 转换为 3。同样,您可以使用 floor(float $value) 函数将分数或小数舍入为最接近的整数。它将把 2.1 和 2.9 都更改为 2。

这些函数有助于轻松地对不同计算的结果进行舍入。假设您需要知道大厅可容纳多少人(根据其面积)。除法后的最终答案很可能是一个十进制数,但你不能将人分成分数,因此正确的答案将是计算值的下限值。

您经常需要将数字向上或向下舍入为最接近的整数。例如,您可能想要将 2.1 更改为 2,但将 2.9 更改为 3。这可以使用 round($value, $ precision, $mode) 函数轻松完成。 $ precision 参数确定要舍入的小数位数。默认值 0 将仅返回整数。第三个 $mode 参数用于确定如果要舍入的数字恰好位于中间会发生什么。您可以使用它来指定是否应将 3.5 更改为 3 或 4。

最小值和最大值

PHP 还有两个函数 min($values)max($values) 来帮助您确定集合或数组中的最低和最高值数字。这些函数可以接受不同类型的参数,例如两个数组和一个字符串。您应该查看文档以了解如何比较它们。

<?php

$hall_width = 120;
$hall_length = 180;
$per_person_area = 35;

$hall_capacity = floor($hall_length*$hall_length/$per_person_area);

// Output: The hall can only accommodate 925 people.
echo 'The hall can only accommodate '.$hall_capacity.' people.';

$water_tank_volume = 548733;
$bucket_volume = 305;

$buckets_needed = ceil($water_tank_volume/$bucket_volume);

// Output: We will need 1800 buckets of water to completely fill the tank.
echo 'We will need '.$buckets_needed.' buckets of water to completely fill the tank.';

$marks = [49, 58, 93, 12, 30];

// Output: Minimum and maximum obtained marks in the exam are 12 and 93 respectively.
echo 'Minimum and maximum obtained marks in the exam are '.min($marks).' and '.max($marks).' respectively.';
?>

整数除法

您还可以使用 intdiv($dividend, $divisor) 函数在 PHP 中执行整数除法。在这种情况下,除法后仅返回商的整数部分。同样,您还可以使用 fmod($dividend, $divisor) 函数获得两个参数相除后的余数或模数。返回值的大小始终小于 $divisor 的大小。

还有一些其他有用的函数,例如 is_nan($value)is_finite($value)is_infinite($val) 可用于确定该值是否为数字,如果是数字,则确定它是有限还是无限。请记住,PHP 认为任何太大而无法放入浮点数的值都是无限的。因此 is_finite() 将返回 true 100 阶乘,但 false 1000 阶乘。

在 PHP 中生成随机数

事实证明,随机数在许多情况下都非常有用。您可以使用它们为您的应用程序生成“随机”数据或在游戏中生成敌人实例等。记住这一点非常重要,我们在本节中讨论的函数都不会生成加密安全的随机数。这些功能仅适用于安全性不成问题的情况,例如向重复访问者显示随机问候文本或生成随机统计数据。

函数 rand($min, $max)mt_rand($min, $max) 可以生成给定值之间的正随机整数,包括 $min$max 值。当不带任何参数调用函数时,它们会生成 0 到 getrandmax() 之间的随机数。您可以 echo getrandmax() 的值来查看这些函数在您的平台上可以生成的最大可能随机数。

函数 mt_rand()rand() 快 4 倍,如果 $max 小于 $min。从 PHP 7.1.0 开始,rand() 实际上已成为 mt_rand() 的别名。唯一的区别是,如果 $max 小于 $min ,则 rand() 仍然不会给出错误,以保持向后兼容性。

这是一个循环,用于生成 0 到 100 之间的随机值一百万次。正如您所看到的,值 0、50 和 100 大约生成了 10,000 次,并且有轻微波动。

<?php

$rand_values = [];
$sum = 0;
$count = 1000000;

for($i = 0; $i < $count; $i++) {
    $rand_values[$i] = mt_rand(0, 100);
    $sum += $rand_values[$i];
}

$count_frequency = array_count_values($rand_values);

// Output: 100 was randomly generated 9969 times.
echo '100 was randomly generated '.$count_frequency[100].' times.';

// Output: 50 was randomly generated: 9994 times.
echo '50 was randomly generated: '.$count_frequency[50].' times.';

// Output: 0 was randomly generated: 10010 times.
echo '0 was randomly generated: '.$count_frequency[0].' times.';

// Output: Average of random values: 49.97295
echo 'Average of random values: '.($sum/$count);

?>

这两个函数也有自己的种子函数,称为 srand()mt_srand() ,为随机数生成器提供种子。您应该记住,您只在程序中调用 srand()mt_srand() 一次。在每次调用 rand()mt_rand() 之前调用它们每次都会给你相同的“随机”数字。

<?php

srand(215);
echo rand()."\n"; // 330544099
srand(215);
echo rand()."\n"; // 330544099
srand(215);
echo rand()."\n"; // 330544099
echo rand()."\n"; // 138190029
echo rand()."\n"; // 1051333090
echo rand()."\n"; // 1219572487

?>

最终想法

PHP 附带了许多内置函数,可以满足您所有的日常计算需求。您可以使用这些函数自己进行稍微复杂的计算,例如 GCD、LCM 和阶乘。

使用這些函數時,您應該記住幾件事。例如, floor()ceil() 等函數傳回的值是一個整數,但它仍然是一個浮點數。同樣,所有三角函數都希望它們的角度以弧度為單位。如果您向它們傳遞一個您希望被視為度度量的角度值,您將得到不正確的結果。因此,請務必檢查文件中所有這些函數的傳回值和預期參數。

#

以上是使用 PHP 的內建數學函數探索三角學、隨機數生成等的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn