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

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

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

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

Q&A

解決済

2回答

1242閲覧

PHPでランダムに数字が欲しい(ただし指定数を除外)

marorin

総合スコア12

PHP

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

0グッド

1クリップ

投稿2020/05/08 11:17

編集2020/05/08 11:29

$user_id1と$user_id2として、1から100までの値を重複しないように取得したいです。

以下考えたのですが「成功するまでループする」という方法でとても無駄な処理に感じます…

php

1$user_id1 = rand(1, 100); 2$user_id2 = rand(1, 100); 3$user_id2 = unique_user_id2( $user_id1, $user_id2 ); //「成功するまでループする」 4 5function unique_user_id2( $user_id1, $user_id2 ){ 6 if ( $user_id1 === $user_id2 ){ 7 $user_id2 = rand(1, 100); 8 }else{ 9 $user_id2 = $user_id2; 10 } 11 12 //「成功するまでループする」 13 if ( $user_id1 === $user_id2 ){ 14 $user_id2 = unique_user_id2( $user_id1, $user_id2 ); 15 } 16 17 return $user_id2; 18}

もっとこう、以下のように一発でできるような方法はございませんでしょうか?

php

1$user_id2 = rand(1, 100, 【ただし$user_id1は除く】); 2/* 3$user_id2として1から100までのランダムな値を取得したいが 4ただし$user_id1は除いた値であったほしい 5という意味です 6*/

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

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

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

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

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

guest

回答2

0

ベストアンサー

shuffleするのとは違うのでしょうか?

PHP

1$user_id1=range(1,100); 2shuffle($user_id1); 3print_r($user_id1);

投稿2020/05/08 11:22

yambejp

総合スコア116724

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

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

yambejp

2020/05/08 11:31 編集

「ただし$user_id1は除く」が何をしたいかわかりません
marorin

2020/05/08 11:30 編集

>shuffleするのとは違うのでしょうか? そちらですと$user_id2はどうやって取得することになるのでしょうか? >「ただし$user_id1は除く」が何をしたいかわかりません すみません。コメントアウトで追記しました。
yambejp

2020/05/08 11:31

$user_id1 と$user_id2が同じものなので、除いたらなにも残らないのでは?
marorin

2020/05/08 11:31 編集

>$user_id1 と$user_id2が同じものなので、除いたらなにも残らないのでは? いえ、異なるものであってほしいのです。
yambejp

2020/05/08 11:34 編集

失礼しました。randで値をとってるのですね・・・ で、話はもどって回答のとおりではいけないのでしょうか?
marorin

2020/05/08 11:36

>同じものですよね? 以下実行していただくとわかると思うのですが、同じにならないと思います。 $user_id1 = rand(1, 100); $user_id2 = rand(1, 100); var_dump($user_id1); var_dump($user_id2); そしてたまに同じになってしまうので、それを回避したいというのが質問です。
marorin

2020/05/08 11:38 編集

>失礼しました。randで値をとってるのですね・・・ >で、話はもどって回答のとおりではいけないのでしょうか? すみません、わたしも戻してしまうのですが、で、ご回答ですと$user_id2はどうやって取得することになるのでしょうか?
yambejp

2020/05/08 11:41 編集

ちょっと誤解がありました。 $ids=range(1,100); shuffle($ids); list($user_id1,$user_id2)=$ids; print "$user_id1={$user_id1}<br>"; print "$user_id2={$user_id2}<br>";
marorin

2020/05/08 11:45

shuffleしてからlistとは目からうろこでした。ありがとうございました。
guest

0

1~100の中から、重複しない2つの値をランダムに取り出すのであれば

PHP

1$range_array = range(1,100);//1~100までの配列を準備(キーは0~99) 2 3$uid1_key = array_rand($range_array);//キーをランダムに1個取得 4$user_id1 = $range_array[$uid1_key];//ランダムに取得したキーから値を取得 5unset($range_array[$uid1_key]);//$user_id1で使用した値を配列から削除 6 7$uid2_key = array_rand($range_array);//キーをランダムに1個取得(この時、user_id1で使用したキーは存在しないため重複は起きない 8$user_id2= $range_array[$uid2_key];//ランダムに取得したキーから値を取得

これでどうでしょうか?
(但し、array_randで取得できる「ランダム」は疑似乱数のため、暗号学的な使い方には不適ですのでご注意下さい)

投稿2020/05/08 11:36

編集2020/05/08 11:54
Take_it

総合スコア357

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

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

marorin

2020/05/08 11:40

ありがとうございます。コメントアウトを読むとできそうに思ったのですが、 unset($range_array($uid_key)); の行で PHP Fatal error: Can't use function return value in write context in ●●● というエラーでした。
Take_it

2020/05/08 11:49

すみません。既に修正済みですが、 unset($range_array($uid_key)); は unset($range_array($uid1_key)); の誤りでした。
Take_it

2020/05/08 11:53

すみません×2 unset($range_array[$uid1_key]); です。。。
marorin

2020/05/08 11:56

いえ×2 よく読めばわかる誤字レベルですからこちらの確認不足でした。 ご修正ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問