例えば「1」〜「10」までの要素の中から3つだけランダムに抽出したいときはどようなコードを書けばいいのですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
teratail内を"乱数 重複"で検索されるだけでもお探しの回答はいくつも見つかると思います。
例えば、下記の回答などが参考になるかと思います。
投稿2017/10/17 18:05
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
10個のうち3個なら他の人の方法でもいいけど、100000個のうち10個みたいになっても使える方法を考えてみました
といっても、それだけ確率が低いなら乱数振り直しでもいいと思いますが…
c++
1 2#include <iostream> 3#include <unordered_set> 4 5int xrand(std::unordered_set<int> &history, int max){ 6 int num = max - history.size(); 7 if (num <= 0) return -1; 8 9 // 乱数生成はマシなやつ使ったほうがいいかも 10 int ret = rand() % num; 11 12 int skip = 0; 13 for(auto i : history){ 14 if (i <= ret) skip++; 15 } 16 17 while(0 < skip){ 18 ret++; 19 if (history.find(ret) == history.end()) skip--; 20 } 21 history.insert(ret); 22 return ret; 23} 24 25int main(){ 26 std::unordered_set<int> history; 27 // サンプル用に10回出しているけど、3回でいいよね 28 for (int i = 0; i < 10; i++){ 29 std::cout << xrand(history, 10) << std::endl; 30 } 31 return 0; 32} 33 34
投稿2019/01/07 09:28
総合スコア2856
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
1~10の値を入れた配列を用意してあれこれする方法だと,取り得る値の範囲が大きいときにどうなんだろう…とか思ったので,
別の方向の方法が無いかな,とか考えた感じ……
値が重複しないように選ぶ=組合せの中から1つ選びだす,と捉えれば,
「可能な組み合わせの中のm番目の組み合わせを求める手段」が存在すれば,mの値だけを乱数で決めれば良いように思われた.
当然ながら,「m番目の組み合わせを求める手段」を用意せねばならないという点が問題になるけど……
多分,↓のリンク先がそういう話だと思う(? 内容理解してないです)
https://msdn.microsoft.com/ja-jp/library/cc404918(v=vs.71).aspx
投稿2019/01/07 05:15
総合スコア11632
0
他の回答にありますように、過去質問を漁ればたくさん出てくると思います。
が、暇だったので自分で書いてみました。
C言語だと一番オーソドックスな書き方だと思います。
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4int main(void) 5{ 6 int r[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 7 int i, j, n; 8 int max = 10; 9 10 srand(time(NULL)); 11 for(i = 0; i < 3; i++){ 12 n = rand() % max; 13 printf("%d\n", r[n]); 14 for(j = n; j < 9; j++) r[j] = r[j + 1]; 15 max--; 16 } 17 return 0; 18}
投稿2017/10/17 23:49
編集2017/10/20 04:14総合スコア16996
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/20 04:10
2017/10/20 04:12
0
たとえば、配列に1~10を入れといて/乱数でかき混ぜて/アタマ3つを取り出せばいいんじゃね?
C++
1#include <iostream> 2#include <iomanip> 3#include <random> 4#include <array> 5#include <algorithm> 6 7int main() { 8 using namespace std; 9 array<int,10> data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 10 mt19937 gen; // メルセンヌ・ツイスタ 11 12 for ( int i = 0; i < 10; ++i ) { 13 shuffle(begin(data), end(data), gen); // かき混ぜて 14 cout << setw(3) << data[0] // アタマ3つを表示 15 << setw(3) << data[1] 16 << setw(3) << data[2] << endl; 17 } 18}
投稿2017/10/17 23:06
総合スコア16614
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。