0 レビュー
2 回答
php-大きな整数の計算で500サーバーエラー
XYZスペースでランダムな位置を吐き出す機能があります。半径が1e+06を超えると、500の内部サーバーエラーが発生します。私の直方体の位置ポピュレーターには同じ問題がないようです。これは、新しい位置を最大制限として定義されたディメンションと比較するだけです。私は数学があまり得意ではなく、計算で何か問題が発生しているのではないかと疑っています。これは、整数が大きすぎるなどのPHPを強制終了する可能性があります。ただし、64ビットシステムです。
/*
* $loc = Point of Origin
* $r = Maximum radius
* $ylimit = Limit locations on Y Axis
*/
function basic_spheroid_point( $loc, $r, $ylimit = 0 ) {
list ($cx, $cy, $cz) = $loc;
static $cnt = 0;
$dx = randint( -$r, $r );
$dy = randint( -$r, $r );
$dz = randint( -$r, $r );
$dd = sqrt( $dx * $dx + $dy * $dy + $dz * $dz );
if ( $dd > $r ) {
$cnt++;
if ( $cnt <= 10000 )
return basic_spheroid_point( $loc, $r, $ylimit );
}
$cnt = 0;
$dx = $r * $dx / $dd;
$dy = $r * $dy / $dd;
$dz = $r * $dz / $dd;
$loc = array( $cx + $dx, $cy + $dy, $cz + $dz );
if ( $ylimit > 0 ) {
if ( $loc[1] < $ylimit && $loc[1] > -$ylimit ) {
return $loc;
} else {
return basic_spheroid_point( $loc, $r, $ylimit );
}
} else {
return $loc;
}
}
function randint($min = 0, $max = 0) {
if ( function_exists( 'random_int' ) ):
return ( $min === 0 && $max === 0 ) ? random_int(0, PHP_INT_MAX) : random_int($min, $max);
elseif (function_exists('mt_rand')):
return ( $min === 0 && $max === 0 ) ? mt_rand() : mt_rand($min, $max);
endif;
return ( $min === 0 && $max === 0 ) ? rand() : rand($min, $max);
}
これはすでに回答されている可能性がありますが、検索や同様の質問で何も得られませんでした。
わからない
0
レビュー
答え :
解決策:
非常に簡単でした。他のいくつかの問題は別として、本当の理由は
if ( $loc[1] < $ylimit && $loc[1] > -$ylimit ) {
&&
を使用し、リソースがなくなるまでスクリプトが関数を使用し続けるようにします。 OR演算子である必要があります||
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。