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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

221閲覧

3~6の間の整数になるランダムな数字でその日は常に同じ数字になるようにするには?

yasuzombie

総合スコア10

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/12/25 12:36

編集2017/12/25 13:23

説明が難しいですが

3~6の間のランダムな整数を出力するのは簡単なのですが

その処理を動かす日は、常に同じ数字を出力したいです。

要するに処理するごとにランダムではなく。
日が変わるごとにランダムに数字を変えたいです。3~6の間で。

処理を実行する日は、常に同じ数字にしたいです。

1日 5
2日 3
3日 6
4日 4
5日 6
6日 3
7日 5
8日 4

言語はjavascript
ウェブサイトで使います

日によってランダム
連番はNGです
誰がアクセスしても、その日の実行結果は同じにしたいです

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

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

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

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

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

guest

回答3

0

日付から、何らかのハッシュ値を作って、その値を4で割った余りを元にすればいいかと思います。

投稿2017/12/25 12:49

otn

総合スコア84499

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

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

think49

2017/12/25 15:44 編集

勘違いしていたようなので削除
yasuzombie

2017/12/25 22:10

ご回答ありがとうございました。
guest

0

ベストアンサー

要件の確認

質問文上にある要件は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 14:01

編集2017/12/25 14:05
think49

総合スコア18162

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

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

yasuzombie

2017/12/25 22:11

ご丁寧な回答ありがとうございました。 解決できそうです。
guest

0

日によってランダム

連番はNGです

連番がNGという時点ですでにランダムではないように見えますが?
単純にMath.randomするとして結果をクッキーに保持します。

仮にクッキー:num

  • numが存在しなければランダムな数字を抽選します。
  • 得た値を当日の23時59分59秒を生存期限としてnumを保存します
  • numが存在していればその値を表示します

上記で日ごとにランダムな日付を表示できます。
これにくわえ、連番でNGがでなくするためには、
前回の抽選値と今回の抽選値を1日後の23時59分59秒まで保持すれば調整できるでしょう

投稿2017/12/25 13:14

yambejp

総合スコア114769

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

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

yasuzombie

2017/12/25 22:09

ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問