質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2428閲覧

phpで、ページごとに、一意ではないランダムな数値を発生させる方法

kenn

総合スコア15

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2016/06/08 07:19

###前提・実現したいこと

100ページほどのサイトのヘッダーのメニュー部分を
インクルードで呼び出して、管理しています。

<php?
include(/menu.php');
?>
のような形です。

menu.php
の中身は、下記のようにrand関数で、
0〜5の値をランダムに発生させて
0 1 2 3 4 5のいずれかの値を
100ページのメニュー部分の最下部に表示させたいと
考えております。

###該当のソースコード
menu.phpファイル内の記述ーーー

<php?
rand(0,5);
?>

ーーーーーーーーーーーーーーー

###試したこと
このようにした際に、
100ページ全てのページに
同じタイミングでアクセスすると、
同じ文字が表示されてしまいます。

今回達成したいと考えているのが、
同時に、異なった値をランダムに表示させたいと
考えております。

現在は、0〜5の、いずれかの数値が表示されているのですが、
100ページのそれぞれのページで、
0 1 2 3 4 5のいずれかの値を、均等に表示したいのです。

(現在の状態だと、厳密に確認すれば、
「1」が表示されている瞬間には、別の99ページにも、
「1」が表示されてしまっています。
これを、バラバラの値にしたいのです。)

インクルードを使うと、同じ値を
引っ張り出してきてしまうため、
インクルードを使わない方法になるのかもしれません。

それぞれの100ページに対して、
まんべんなく、0〜5のいずれかの
数字を表示させることは、
可能なのでしょうか?

phpに詳しい方がおられましたら、
ぜひとも、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2016/06/08 07:29

php上でやることは必須ですか?Javascript等でブラウザ側でやることも可能かと思われますが…
lllnorikolll

2016/06/08 08:42 編集

test.php に、echo rand(0,5); を、test1.php と test2.php に、 include('./test.php'); を記載し、test1.php と test2.php を同時実行しましたが、おっしゃている現象が、再現できません。 「1」が表示されているとき、他の99ページにも「1」が表示されているとのことですが、「2」が表示されているときはどうでしょうか。 もし、「1」以外が一切表示されないようであれば、rand以外の箇所に問題があるかもしれません。
kenn

2016/06/08 09:09

ご連絡ありがとうございます。 できることであれば、管理のしやすさの部分で、phpで解決できたらと思っております。 javascriptで、乱数を発生させると、各ページで、別の値が表示されるということなのですね。代替案として、のちほど検討したいと思います。 test.phpの同時実行の件は、質問内容を分かりやすくするため、端折っている箇所があり、申し訳ないです。 たとえば、下記のurlのような形で、時間ごとに、randで発生させた乱数の値を取得すると、test1.phpでも、test2.phpでも、同じ値が表示されると思います。 http://on-ze.com/archives/1838 わたしも、別の値になると思っていたのですが、たとえば、上記、「こんにちは」の部分に乱数を発生させると、全ページで、一意の値になってしまうのです。 なんとかして、全ページでまんべんなく、ランダムな0〜5の値を、表示させたいと考えております。 ご検討の程、どうぞよろしくお願い致します。
lllnorikolll

2016/06/08 09:15

頂いたURLの先を拝見しましたが、rand関数は使用していないようです。やりたいことに対して、rand関数を用いることは、間違っていません。何か他の箇所に問題がありそうです。可能であれば、再現性のあるサンプルコードの記載をお願い致します。
guest

回答3

0

まんべんなくというのは難しいですが、乱数を使うときは初期化するのが基本ですね。
http://php.net/manual/ja/function.srand.php

リンク先の方法でやっても厳密に全く同じタイミングで処理されれば、srandの引数の値は同じになってしまうので結果は一緒ですが、実際の運用では問題にならないと思います。
もし問題になるようでしたら、ユニークな値になるよう、クライアントのIPで加工するとか、工夫すると良いと思います。

投稿2016/06/08 07:38

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lllnorikolll

2016/06/08 08:52

PHP4.2.0以降、自動で実行されるので、srandは不要となりました。 リンクしてくださっているマニュアルのページにも、以下の記載があります。 > 注意: srand() または mt_srand() によりランダム数生成器にシードを与える必要はありません。 これは、この処理が自動的に行われるためです。
ttyp03

2016/06/08 23:43

指摘ありがとうございます。 今は不要なんですね。 勉強になりました。
guest

0

ベストアンサー

どこまでこだわるかにもよりますが…

PHP

1$file = basename($_SERVER['PHP_SELF']); 2$filename = str_replace('.php','', $file); 3$checksum = crc32($filename); 4$v = (rand(0,5) + $checksum) % 6; 5echo $v;

投稿2016/06/08 08:13

編集2016/06/08 08:53
takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenn

2016/06/08 08:43 編集

ありがとうございます。 なんとか「ページ番号」と書かれている部分が 振られていない場合のアイディアがありましたら、大変嬉しいです。 現在のサイトですと、ページ番号がなく、ファイル名が〇〇.phpで、〇〇の部分が日本語に、なっています。 ファイル名の日本語の、〇〇部分自体は、 下記の方法で、$filenameとして、取得できました。 <?php $file = basename($_SERVER['PHP_SELF']); $filename = str_replace('.php','', $file); ;?> この$filenameを、数字に 変換できたらと思っております。 (可能であれば、変換した結果ができるだけ、 上記の場合ですと、6で割った時の余りの結果が ランダムになるとベストです。 もしくは、何もないところから ページ番号に当たるような値を、 各ページに対して一意に振る方法がありましたら、 解決に近づけそうです。 ちなみに、100ページは、今後増えていく可能性があります。) かなり近いところまで、教えて頂き 誠にありがとうございます。
takasima20

2016/06/08 08:55

ページ番号ではないのですが、ファイル名それぞれに 異なる数字を割り振る方式でコードを修正しました。
guest

0

通常の使い方だと、

このようにした際に、

100ページ全てのページに
同じタイミングでアクセスすると、
同じ文字が表示されてしまいます。

という動作はしないはずなので
挙動としては、randの問題というよりはキャッシュが効きすぎてるんじゃないかなと言う気がします。

テンプレートエンジンを使ったり、アクセラレータを入れたり、CDN経由でアクセスしているというような事はありませんか?

今回のケースで確実な対応としては、
javascriptでランダムな値を生成して組み込むことかと思います。
*javascriptが無効な場合に対応出来なかったり、ランダムな値にセキュリティ的な意味がある場合は問題があるという制約はあります。

追記
内容的にはサーバサイドでやるに越したことが無いかと思いますので、
ttyp03さんの方法を試されるのが最初かと思います。

投稿2016/06/08 07:42

編集2016/06/08 07:46
tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問