C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: C#で配列のランダムにする方法


(過去ログ 75 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■44183 / inTopicNo.1)  C#で配列のランダムにする方法
  
□投稿者/ 烈火 (1回)-(2009/12/01(Tue) 11:15:50)

分類:[.NET 全般] 

いまC#でデータベースから問題を呼び出して配列に格納して出題するようなプログラムを作ってます。
そこで呼び出したら配列の中身をランダムに入れ替えたいと思っています。
乱数などの使い方がいまいちわからないんふぇす。

ご回答お願いいたします。
引用返信 編集キー/
■44185 / inTopicNo.2)  Re[1]: C#で配列のランダムにする方法
□投稿者/ επιστημη (2293回)-(2009/12/01(Tue) 11:26:58)
επιστημη さんの Web サイト
↓こんなんでいかがかの。
http://blogs.wankuma.com/episteme/archive/2009/07/13/177448.aspx

引用返信 編集キー/
■44186 / inTopicNo.3)  Re[1]: C#で配列のランダムにする方法
□投稿者/ 魔界の仮面弁士 (1402回)-(2009/12/01(Tue) 11:29:39)
2009/12/01(Tue) 11:32:48 編集(投稿者)

No44183 (烈火 さん) に返信
> 乱数などの使い方がいまいちわからないんふぇす。

擬似乱数の生成方法は幾つかありますが、System.Random を使うのが簡単かと思います。


> いまC#でデータベースから問題を呼び出して配列に格納して出題するようなプログラムを作ってます。
> そこで呼び出したら配列の中身をランダムに入れ替えたいと思っています。

同じ問題が連続して出題されても良いのか、それとも、
同じ問題は使わないようにするかで、実装が異なってきます。


同じ問題を使わないようにしたいなら、「くじ引き」の要領で選んでいっては如何でしょう。

(1) DB 上の元データを、一度 List<T> クラスに転記しておく。
(2) random.Next(list.Count) で問題番号 n を選ぶ。
(3) 選択された list[n] を、出題リスト(別の List、あるいは配列など)に登録する。
(4) 一度選んだ問題 n を、元データから list.RemoveAt(n) にて削除する。
(5) 手順 2 に戻って、次の問題を選ぶ。
(6) これを繰り返して、出題リストを作成する。
引用返信 編集キー/
■44191 / inTopicNo.4)  Re[2]: C#で配列のランダムにする方法
□投稿者/ 烈火 (2回)-(2009/12/01(Tue) 12:30:29)
DBからあらかじめ10問とりだして配列にいれます。
そのあと10問はいった配列をランダムに入れ替えようと思ってます。

引用返信 編集キー/
■44192 / inTopicNo.5)  Re[3]: C#で配列のランダムにする方法
□投稿者/ みきぬ (676回)-(2009/12/01(Tue) 13:05:24)
No44191 (烈火 さん) に返信
> DBからあらかじめ10問とりだして

ちなみに、この操作はランダムにしているのかしら?
# DBに全部で10問しかなければいいけど
引用返信 編集キー/
■44193 / inTopicNo.6)  Re[4]: C#で配列のランダムにする方法
□投稿者/ 烈火 (4回)-(2009/12/01(Tue) 13:11:27)
条件付きでとりだしています。
問題は全部で50問あります。

引用返信 編集キー/
■44194 / inTopicNo.7)  Re[2]: C#で配列のランダムにする方法
□投稿者/ επιστημη (2295回)-(2009/12/01(Tue) 13:13:31)
επιστημη さんの Web サイト
ん? もう答出てるやん。他になんかわからんことあります?

引用返信 編集キー/
■44232 / inTopicNo.8)  Re[3]: C#で配列のランダムにする方法
□投稿者/ 烈火 (5回)-(2009/12/02(Wed) 10:55:30)
自分なりに変更していきました。
問題用の配列aにDBから問題をもってきて10個格納します。
そのあと入れ替え用に配列bを用意してaの中身をまずbに格納します。
そのあとbからランダムに取り出してaに入れようかと思ってます。


引用返信 編集キー/
■44233 / inTopicNo.9)  Re[4]: C#で配列のランダムにする方法
□投稿者/ ymm (1回)-(2009/12/02(Wed) 11:02:03)

えーと、皆さんの助言はどうされたので?


No44232 (烈火 さん) に返信
> 自分なりに変更していきました。
> 問題用の配列aにDBから問題をもってきて10個格納します。
> そのあと入れ替え用に配列bを用意してaの中身をまずbに格納します。
> そのあとbからランダムに取り出してaに入れようかと思ってます。
>
>

↑にしてもaからランダムに取り出してbに入れるのじゃ駄目なんですか?


とりあえず出来ている部分を書いて頂けます?
引用返信 編集キー/
■44235 / inTopicNo.10)  Re[5]: C#で配列のランダムにする方法
□投稿者/ 烈火 (7回)-(2009/12/02(Wed) 11:12:11)
No44233 (ymm さん) に返信
魔界の仮面弁士さんの意見を参照してつくってみましたがなかなかいかなくて・・・

aからランダムに取り出してbに入れる方が複雑じゃないし無駄な処理がないですね。
どんな感じか教えていただけるとありがたいです。
引用返信 編集キー/
■44236 / inTopicNo.11)  Re[6]: C#で配列のランダムにする方法
□投稿者/ επιστημη (2301回)-(2009/12/02(Wed) 11:16:16)
επιστημη さんの Web サイト
2009/12/02(Wed) 11:30:20 編集(投稿者)
> どんな感じか教えていただけるとありがたいです。

いやだから No44185
# VBじゃダメすか?

using System;

class ShuffleDemo {

    // x と y を交換する
    static void Swap<T>(ref T x, ref T y) {
        T t = x;
        x = y;
        y = t;
    }

    // data[] をかき混ぜる
    static void Shuffle<T>(T[] data) {
        Random rnd = new Random();
        for ( int n = data.Length; n > 0; --n ) {
            // "n未満の乱数"番目 と "n-1"番目とを入れ替える
            Swap(ref data[rnd.Next(n)], ref data[n - 1]);
        }
    }

    public static void Main() {
      int[] data = new int[13];
        // data[] を 1, 2, 3, ... 13 で埋める
        for ( int i = 0; i < data.Length; ++i ) {
            data[i] = i + 1;
        }
        // シャッフルシャッフルぅ
        Shuffle(data);
        // 結果の確認
        foreach ( int item in data ) {
            Console.Write("{0} ", item);
        }
    }

}

引用返信 編集キー/
■44241 / inTopicNo.12)  Re[6]: C#で配列のランダムにする方法
□投稿者/ みきぬ (678回)-(2009/12/02(Wed) 12:27:01)
開発環境も、今までどんなコードを書いたのかもわからんので、好き勝手に予想してみる。

・実は Visual Studio .NET 2003 を使っているので、List<T> がない
・DBから毎回同じ10問を引っ張っているので、いつも同じ問題が選ばれる

# 問題番号をランダムに10個選んで、それを使ってDBから取り出せばええんじゃね?
# とも思ったりしたけど、思うだけにしとこうっと。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -