C# を使用して一意の乱数を生成する - asp.net チュートリアル
試験問題を自動的に生成できる試験システムを構築する場合、繰り返しのない一連の質問をランダムに生成する必要があることがよくあります。.net Framework には、乱数の生成に特に使用されるクラス System.Random が用意されています。
乱数に関しては、コンピューターが完全に乱数を生成することが不可能であることは誰もが知っています、いわゆる乱数生成器は、事前に選択されたランダムシードに対して特定のアルゴリズムを使用して複雑な演算を実行し、生成された結果を使用して近似します。完全に乱数のシミュレーションは擬似乱数と呼ばれます。擬似乱数は、有限の数値セットから等しい確率で選択されます。選択される数値は完全にランダムではありませんが、実用的な目的には十分なランダムです。擬似乱数の選択はランダム シードから始まるため、毎回取得される擬似乱数が十分に「ランダム」であることを保証するためには、ランダム シードの選択が非常に重要です。乱数シードが同じであれば、同じ乱数発生器で生成される乱数も同じになります。一般に、システム時間に関連するパラメーターを乱数シードとして使用します。これは、.net Framework の乱数ジェネレーターで使用されるデフォルトの方法でもあります。
乱数生成器は 2 つの方法で初期化できます:
最初の方法はランダム シードを指定せず、システムは現在時刻をランダム シードとして自動的に選択します:
Random ro = new Random();
2 番目の方法は次のことができます。ランダムシードとして Int 型パラメータを指定します:
int iSeed=10;
Random ro = new Random(10);
long tiny = DateTime.Now.Ticks;
Random ran = new Random((int)(tick & 0xffffffffL) | ( int) (tick >> 32));
これにより、99% が同じではないことが保証されます。
その後、この Random クラス オブジェクトを使用して乱数を生成できます。このとき、Random.Next() メソッドを使用する必要があります。この方法は非常に柔軟で、生成される乱数の上限と下限を指定することもできます。
上限と下限を指定しない場合の使用は以下の通りです:
int iResult;
iResult=ro.Next();
以下のコードは100未満の乱数を返すことを指定しています:
int iResult;
int iUp=100 ;
iResult=ro.Next (iUp);
次のコードは、戻り値が 50 ~ 100 の範囲内である必要があることを指定します:
int iResult;
int iUp=100;
int iDown=50;
iResult=ro .Next(iDown,iUp );
Random.Next() メソッドに加えて、Random クラスには、0.0 ~ 1.0 の範囲でランダムな倍精度浮動小数点数を生成する Random.NextDouble() メソッドも用意されています。
double dResult;
dResult=ro. NextDouble();
ただし、Randomクラスを使って質問番号を生成すると重複が発生するため、特に質問数が少ない場合は重複しない質問を生成することが難しいのでいくつかのメソッドを参考にさせていただきます。インターネット上では 2 つのカテゴリが含まれます。1 つ目のタイプはランダム シードから始まり、重複がないように各ランダム シードが異なります。2 つ目のタイプはいくつかのデータ構造とアルゴリズムを使用します。以下では、主に 2 番目のカテゴリのいくつかの方法を紹介します。
方法 1: アイデアは、配列を使用してインデックス番号を保存し、最初に配列の位置をランダムに生成し、次にこの位置のインデックス番号を取り出し、最後のインデックス番号を現在の配列位置にコピーしてから、乱数の上限は 1 ずつ減ります。具体的には、まずこれら 100 個の数値を配列に入れ、毎回ランダムに位置を選択します (1 回目は 1 ~ 100、2 回目は 1 ~ 99、...)。位置を変更します。番号は最後の番号に置き換えられます。
int[]index = new int[15];
for (int i = 0; i index = i;
Random r = new Random();
//ランダム生成を保存するために使用されます10 個の非繰り返し数値
int[] result = new int[10];
int site = 15;//下限を設定します
int id;
for (int j = 0; j {
id = r.Next(1, site - 1);
//ランダムな位置の数値を取り出し、結果配列に保存
result[j] =index[id];
//最後の数値をコピー現在位置へ
index[id] =index[site - 1];
//位置の下限を1つ減らす
site--;
}
方法2:Hashtableを使う。 [NextPage]
ハッシュテーブル hashtable = new Hashtable();
ランダム rm = new Random();
int RmNum = 10;
for (int i = 0; hashtable.Count < RmNum; i++)
{
int nValue = rm.Next(100);
if (!hashtable.ContainsValue(nValue) && nValue != 0)
{
hashtable.Add(nValue, nValue);
Console.WriteLine(nValue.ToString());
}
}
方法3:再帰、生成した乱数が重複しているかどうかを検出するために使用し、取り出した数値がすでに取得した数値と重複している場合は、再度ランダムに取得します。
ランダム ra=new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=new int[10];
int tmp=0;
int minValue=1;
int maxValue=10;
for (int i=0;i {
tmp=ra.Next(minValue,maxValue) //ランダムに数値を選択します
arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); / / 値を取り出して配列に代入します
}
.........
.........
Public int getNum(int[] arrNum,int tmp,int minValue, int maxValue,Random ra )
{
int n=0;
while (n<=arrNum.Length-1)
{
if (arrNum[n]==tmp) // ループを使用して重複があるかどうかを判断します
{
tmp=ra.Next (minValue,maxValue); //ランダムに再取得。
getNum(arrNum,tmp,minValue,maxValue,ra);//再帰: 取り出した数値がすでに取得した数値と同じ場合、ランダムに再度取得します。
}
n++;
}
return tmp;
}

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。

C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。
