phpに関する質問です。

アクセス毎にランダム文字列を発生させるには
$Random = round(rand(1,3));
switch($Random){
case 1:
$Random = "A";break;
case 2:
$Random = "B";break;
case 3:
$Random = "C";break;
}
としているのですが
日毎にランダム文字列を発生させるにはどうしたらよいでしょうか?
今日は何度アクセスしても同じ文字列で
明日は昨日と異なる文字列が何度アクセスしても同じになる
これを実現するソースコードを書いて頂ければ幸いです。
よろしくお願い致します。

回答の条件
  • 1人2回まで
  • 登録:2009/05/28 02:31:16
  • 終了:2009/06/04 02:35:02

回答(6件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/05/28 06:47:48

ポイント19pt

前回アクセスしてきた日を相手のパソコン上に記憶させます。

その仕組みとしてcookieというものがあります。

とほほのCookie入門

(サーバ側でパソコンを特定する事は出来ないため

 パソコン側のcookieにて情報を保持してもらって

 次回以降、その情報を元に同じパソコンかどうかを判断させます)


以下ではクッキーに LastAccess と Random という2つの値を持たせています。

流れとしては

(1)LastAccess が存在すれば アクセス日と比較して

   前回も本日中であれば Random を読み取ります。

(2)Randomが""ならば新たに生成します。

(3)最終アクセス日を新たにセットしなおします。

ただし、動作確認せずにいきなり回答しておりますので

最下部マニュアルなどを参照しながら適宜対応してくださいませ。

<?php
// (0)変数準備
$now_time = time();// アクセス時刻
$now_date = gmdate("Ymd", $now_time); // アクセス日
$Random = "";

// (1)クッキー読み取り
if (isset($_COOKIE['LastAccess'])) {
    if ($_COOKIE['LastAccess'] < $now_date) {
        if (isset($_COOKIE['Random'])) {
            $Random = $_COOKIE['Random'];
        }
    }
}

// (2)文字列生成
if ($Random == "") {
    $Random = round(rand(1,3));
    switch($Random){
    case 1:
        $Random = "A";break;
    case 2:
        $Random = "B";break;
    case 3:
        $Random = "C";break;
    }
}

// (3)クッキーに保存させる(生存期間はアクセス時刻から24時間)
setcookie("LastAccess", "$now_date", $now_time + 24 * 3600);
setcookie("Random", "$Random", $now_time + 24 * 3600);

// (4)表示
echo $Random;
?>

※生存期間は期間を区切らず永続的にというのも可能ですが、適当な期間をいれるのが慣例。

(本日か、それとも前日かが判れば良いので24時間としています)

PHP: $_COOKIE - Manual

PHP: setcookie - Manual

PHP: gmdate - Manual

id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812009/05/28 07:57:18

ポイント19pt

まず、いくつかの中から選ぶというのは配列にして array_rand や shuffle を使うと語句を増減した際に Case とかいちいち書かずにすむので楽です。

乱数は srand という初期化関数があり、同じ値で初期化すると同じパターンで乱数を生成します。これに date を用いて年月日で乱数を初期化してみました。

<?php
srand(date('Ymd')) ;

$words = array('Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo') ;
$put = $words[array_rand($words)] ;

echo $put ;
?>
id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912009/05/28 08:54:06

ポイント18pt

お使いのPHPのバージョンはいくつでしょうか。

プログラムが発生する乱数は、疑似乱数なので通常初期化関数(乱数のシード(seed)設定)を最初に呼び出す必要があります。


ただ、PHP では 4.2 以降内部的にこの処理を行っているので、普通に呼び出すだけでランダムな数列を得られるはずなのですが、

変わらないということであれば、バージョンが古いか、日付で srand を呼んでいるためだと思います。


バージョンが 4.2 以降であれば、上記の関数を削除してください。

バージョンがこれより前のバージョンであれば、

srand(time());

のように現在時間で初期化する処理を追加してみてください。

http://always-pg.com/php/std_rd/number/srand.html

id:pahoo No.4

pahoo回答回数5960ベストアンサー獲得回数6332009/05/28 14:16:26

ポイント18pt

$Random にはアルファベット1文字が入るという想定で回答します。

今日の日付(yyymmdd)の md5 ハッシュ値を取り出し、その先頭2バイトを使ってアルファベット1文字を取り出す方法を以下に示します。

$table の内容、長さは自由に変えることができます。ただし、マルチバイト文字(日本語)は利用できません。

$table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';          //このうち1文字を返す
$d1 = date('Ymd');                 //今日の日付
$d2 = md5($d1);                    //MD5ハッシュ値
$d3 = hexdec(substr($d2, 0, 4)) % strlen($table);
$Random = substr($table, $d3, 1);      //適当な1文字
id:scrap49 No.5

scrap49回答回数18ベストアンサー獲得回数42009/05/29 08:12:51

ポイント18pt

日付を取得

$date = strftime("%Y-%m-%d %T");

類推されないようにkeywordを追記

$date = $date . "keyword";

MD5でハッシュ値を求める

$hash = md5($date);

先頭から5文字切り出す

$Random = substr($hash, 0, 5)

生成するランダム文字列が重複する可能性に付いては考慮されてません。

http://q.hatena.ne.jp/1243445473

id:hyoga_h No.6

hyoga_h回答回数23ベストアンサー獲得回数02009/06/01 05:36:52

ポイント18pt

これをランダムと呼ぶのかわかりませんが、

rand()を呼ぶ前に

日付をシードにしてsrand()を呼んでみるのはいかがでしょうか?

ちょっと乱暴な書き方ですが以下のようなイメージです。

srand(date("Ymd"));

$Random = rand(1,3);

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません