🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

533閲覧

配列の中身が13以上の数字だけランダムに並び替える

magomago

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/12/18 11:27

前提・実現したいこと

124の数字が入った配列2つの中身(重複なし)を、112の数字は順番を固定したまま13~24の数字だけを
ランダムに並び替えたいです

[10,3,8,4,1,13,20,16,15,7,19,22] [11,23,2,12,5,9,6,17,21,24,18,14] の中身を [10,20,22,3,19,8,16,4,13,1,7,15] [18,11,2,17,14,12,5,21,23,9,6,24] のようになったものを複数作りたいです

試したこと

12以下を固定せずに全部の配列をランダムに並び替えることは 以下のようにしてできました random_device get_rand_dev; mt19937 get_rand_mt(get_rand_dev()); void new_solution() { for (int i = 0; i < 2; i++) { shuffle(order[i].begin(), order[i].end(), get_rand_mt); } cout << endl; } } 現在orderという二次元配列に [10,3,8,4,1,13,20,16,15,7,19,22] [11,23,2,12,5,9,6,17,21,24,18,14] が入っており vechicleには2が入ります。

補足情報

c++について勉強中です。
ランダムについていまいち理解できておらず、全部の数字をシャッフルすることができましたが
理解不足が否めません。
プログラミングもそこまでできるわけではないので、そこを踏まえて教えていただけると幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

もとの配列から、12以下の配列と13以上の配列を作り、13以上の配列をランダムに並び替え、
その2つを乱数で合成しましょう


もとの配列から、12以下を順番に抜き出した配列を作り、元の配列をランダムに並び替え、
その次にその配列のアタマから順番に見ていって、12以下であるなら、抜き出した配列のアタマから順番にとってきた数字に入れ替える

のほうが手間が少ないですな

投稿2020/12/18 11:31

編集2020/12/18 11:37
y_waiwai

総合スコア88038

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

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

magomago

2020/12/19 03:35

プログラミングがあまりできないため簡単な質問をさせてください 抜き出す作業はpush_backでif分で条件分岐した後swapで入れ替えで大丈夫でしょうか
y_waiwai

2020/12/19 05:22

抜き出すといっても、もとの配列を変えないので、別にリスト用意して、12以下を追加していくだけでいいです また、 入れ替え(swap)じゃなく単なる代入でいいですね
magomago

2020/12/21 08:03

無事できました ありがとうございます
guest

0

解決したのなら、どのように解決したのかを書くべきです。
質問にコードを追記してもらえないでしょうか?

また、質問の「vechicleには2が入ります。」が意味不明です。

元の vector のコピーをとっておいて、先頭から 12以下のものを順番に、
シャッフルした vector の先頭から 12以下のものに代入していけばよいでしょう。

C++

1#include <iostream> 2#include <vector> 3#include <random> 4#include <algorithm> 5 6using namespace std; 7 8random_device get_rand_dev; 9mt19937 get_rand_mt(get_rand_dev()); 10 11void new_solution(vector<int>& o) 12{ 13 vector<int> v = o; 14 shuffle(o.begin(), o.end(), get_rand_mt); 15 auto f = [](int x) { return x <= 12; }; 16 for (auto p = o.begin(), q = v.begin(); 17 (p = find_if(p, o.end(), f)) != o.end(); *p++ = *q++) 18 q = find_if(q, v.end(), f); 19} 20 21void print(const vector<int>& o) 22{ 23 for (int e : o) cout << ' ' << e; 24 cout << endl; 25} 26 27int main() 28{ 29 vector<vector<int>> order = { 30 { 10, 3, 8, 4, 1, 13, 20, 16, 15, 7, 19, 22 }, 31 { 11, 23, 2, 12, 5, 9, 6, 17, 21, 24, 18, 14 } 32 }; 33 for (int i = 0; i < 2; i++) { 34 print(order[i]); 35 new_solution(order[i]); 36 cout << "-->"; 37 print(order[i]); 38 } 39}

実行例

text

1 10 3 8 4 1 13 20 16 15 7 19 22 2--> 16 20 10 3 8 13 4 1 22 19 15 7 3 11 23 2 12 5 9 6 17 21 24 18 14 4--> 11 17 14 21 2 12 18 5 9 24 6 23

投稿2020/12/21 10:38

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問