- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPで作成するジェネレーターでのご質問)
PHPで作成するジェネレーターでのご質問
このQ&Aのポイント
- PHPを使用してツイッター診断メーカーに似たジェネレーターを作成しています。しかし、特定の部分の実装方法がわからず困っています。
- 実装したい機能は、50個の文字列からランダムに1つを選び、10進数に変換してからそれを配列の数で割って余りを求めます。しかし、同じニックネームを入力すると同じ文字列が選ばれる確率が高くなってしまいます。
- バラけた結果を得るためのロジックや参考になるサイトがあれば教えてください。お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
sprintfの"%u"で得られる数値(正しくは数字の文字列)はマイナス符号のない値です。 つまりとりうる範囲は0~4294967295(0xFFFFFFFF)です。 しかしPHPで計算されるときは符号付の数値で計算されます。 つまり範囲は-2147483648~2147483647となります。 $num = sprintf("%u",crc32($click)); で得られる$numは文字列であり $i= $num % $txtNum; の計算の時点で$numは数値として評価されます。 このときに2147483647を超える値の場合にはすべて2147483647として評価されてしまいます。 つまり半分以上の確率で$numは2147483647として計算されるため同じ結果が頻発します。 ですので $num = sprintf("%d",crc32($click)); としてマイナス符号付の数値として$numを受け取り このままでは剰余の計算でマイナスが返ってくることもあるので $i= abs($num % $txtNum); で絶対値を取ればいいと思います。 ・・・断定口調で書いてますが予想して書いたものですので厳密にあっているかは自信ないです。
その他の回答 (1)
- SAYKA
- ベストアンサー率34% (944/2776)
回答No.1
? 言っている意味がわからない。 普通に乱数を生成するのじゃだめなの?
質問者
補足
ご回答ありがとうございます。 すいません、言い忘れていましたが、同じ名前を入力すると同じ結果を表示させたいのです。 なので、乱数ですと結果がその都度変わってしまうので、ご提示したソースのように入力された文字列をベースに10進数に変換しています。 引き続きよろしくお願いします。
お礼
ご回答有難うございます。 頂いた内容で無事解消いたしました!今までからいうとかなり改善されました。 これで問題なく取り組めそうです。 ありがとうございました。