要件の確認
質問文上にある要件は3つありますが、
- 日によってランダム
- 連番はNG
- その処理を動かす日は、常に同じ数字を出力
2つの解釈が成り立ちます。
(A) どのクライアント端末からアクセスしても、同じ日にアクセスしたら同じ番号を出力したい
(B) 同じクライアント端末からアクセスした際に同日実行は常に同じ数字を出力したい
otn さんは (A) と解釈し、yambejp さんは (B) と解釈しました。
(2017/12/25 23:05追記)
条件が追加されました。
(A) が正解のようです。
規則性を考える
yambejp さんが指摘されているように、ここまで規則性が決まっていると、これは乱数ではありません。
「連番はNG」のルールより、次の規則が成り立ちます。
- 3 の次は 5 or 6
- 4 の次は 6
- 5 の次は 3
- 6 の次は 3 or 4
従って、3, 6 の時だけユニークな固定値で次の値を決定すれば良い。
計算しやすいように、[0-3] に直すと、こうなります。
- 0 の次は 2 or 3
- 1 の次は 3
- 2 の次は 0
- 3 の次は 0 or 1
重要なのは昨日の番号と今日の番号が連番にならない事なので、昨日の番号を求められるようになっていなければなりません。
とりあえず、1日を「0」として計算すればいいでしょう。
- 1日 … 0
- 2日 … 3 // [2, 3][new Date().getDate() % 2]
- 3日 … 1 // [0, 1][new Date().getDate() % 2]
- 4日 … 3
- 5日 … 1 // [0, 1][new Date().getDate() % 2]
- 6日 … 3
- 7日 … 1 // [0, 1][new Date().getDate() % 2]
この条件では2が永遠に出ないので、特定条件下(4で割り切れるか等)で日付に1を足すアルゴリズムにする必要があります。
後は、1日から本日までを順番に計算していけば、良いでしょう。
Re: yasuzombie さん
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/25 15:44 編集
2017/12/25 22:10