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

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

ただいまの
回答率

90.40%

  • C#

    7994questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    4121questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3951questions

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

C言語で、乱数で複数の重複しない2つの値をとりたいとき

受付中

回答 6

投稿

  • 評価
  • クリップ 1
  • VIEW 3,033

santaro

score 11

例えば「1」〜「10」までの要素の中から3つだけランダムに抽出したいときはどようなコードを書けばいいのですか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SaitoAtsushi

    2017/10/18 03:03

    この質問は実質的に丸投げであり、 teratail では非推奨とされている形になっています。 問題にどのように取組んでどこで躓いているのか、より具体的な質問にしてください。

    キャンセル

  • 退会済みユーザー

    2019/01/07 17:31

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 6

+1

teratail内を"乱数 重複"で検索されるだけでもお探しの回答はいくつも見つかると思います。
例えば、下記の回答などが参考になるかと思います。

C - C言語で重複しない乱数生成の仕方を教えてください!(28507)|teratail

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

たとえば、配列に1~10を入れといて/乱数でかき混ぜて/アタマ3つを取り出せばいいんじゃね?

#include <iostream>
#include <iomanip>
#include <random>
#include <array>
#include <algorithm>

int main() {
  using namespace std;
  array<int,10> data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  mt19937 gen; // メルセンヌ・ツイスタ

  for ( int i = 0; i < 10; ++i ) {
    shuffle(begin(data), end(data), gen); // かき混ぜて
    cout << setw(3) << data[0] // アタマ3つを表示
         << setw(3) << data[1] 
         << setw(3) << data[2] << endl;
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

他の回答にありますように、過去質問を漁ればたくさん出てくると思います。
が、暇だったので自分で書いてみました。
C言語だと一番オーソドックスな書き方だと思います。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
    int r[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int i, j, n;
    int max = 10;

    srand(time(NULL));
    for(i = 0; i < 3; i++){
        n = rand() % max;
        printf("%d\n", r[n]);
        for(j = n; j < 9; j++) r[j] = r[j + 1];
        max--;
    }
    return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/20 13:10

    j==9 の時に r[10] にアクセスしてしまってますよ(たぶん副作用はないけどなんか不安になる)

    キャンセル

  • 2017/10/20 13:12

    うわ、ホントだ。
    j < 9 が正解ですね。
    指摘ありがとうございます。

    キャンセル

0

1~10の値を入れた配列を用意してあれこれする方法だと,取り得る値の範囲が大きいときにどうなんだろう…とか思ったので,
別の方向の方法が無いかな,とか考えた感じ……
値が重複しないように選ぶ=組合せの中から1つ選びだす,と捉えれば,
「可能な組み合わせの中のm番目の組み合わせを求める手段」が存在すれば,mの値だけを乱数で決めれば良いように思われた.

当然ながら,「m番目の組み合わせを求める手段」を用意せねばならないという点が問題になるけど……
多分,↓のリンク先がそういう話だと思う(? 内容理解してないです)
https://msdn.microsoft.com/ja-jp/library/cc404918(v=vs.71).aspx

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/07 17:23

    ちょっと大きい数になると,リンク先のChoose()がすぐにOverflowしてダメっぽい.

    キャンセル

  • 2019/01/08 02:30

    > 取り得る値の範囲が大きいときにどうなんだろう…

    N個の要素をかき混ぜるときの時間計算量はO(N)だからそんなに気にするほどのことはないような。

    キャンセル

0

10個のうち3個なら他の人の方法でもいいけど、100000個のうち10個みたいになっても使える方法を考えてみました
といっても、それだけ確率が低いなら乱数振り直しでもいいと思いますが…

#include <iostream>
#include <unordered_set>

int xrand(std::unordered_set<int> &history, int max){
    int num = max - history.size();
    if (num <= 0) return -1;

    // 乱数生成はマシなやつ使ったほうがいいかも
    int ret = rand() % num;

    int skip = 0;
    for(auto i : history){
        if (i <= ret) skip++;
    }

    while(0 < skip){
        ret++;
        if (history.find(ret) == history.end()) skip--;
    }
    history.insert(ret);
    return ret;
}

int main(){
    std::unordered_set<int> history;
    // サンプル用に10回出しているけど、3回でいいよね
    for (int i = 0; i < 10; i++){
       std::cout << xrand(history, 10) << std::endl;
    }
    return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

Cなんとかなど不要。そう、シェル芸ならね!

$ jot -r 10 1 1000|paste - <(seq 10)|sort|cut -f2|head -3
7
10
4

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    7994questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    4121questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3951questions

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

閲覧数の多いC#の質問