実験レポートリンク:
https://www.cnblogs.com/nnn13579/p/10992122.html
しやすい異なる回数に基づいて、抽出のための:
これは、特定の学生の結果です。
そのようなステートメントを使用します。
srand関数((符号なし)時間(NULL))。
ここでは、これは1つの効果は次のとおりです。
srand関数((INT)時間(0));
問題はここにあります。
その理由は、あまりにも、コンピュータの秒に、簡単で高速演算速度、正確です。
それが効果的にそれを解決倍増するかどうかにINT?
いいえ、あなたはミリ秒単位まで正確なPHPのLinuxシステムを使用している場合を除きます。
あなたが大量に描きたいときや、それを繰り返すことができます。
繰り返し、再直接のすべてが順調にポンピングするときだから私の最初に考えたのは、でした。
次のコードでそう:
1つの int型のk = 0 。 2 行う{ 3 にsrand((INT)時間(0 ))。 4 のための(int型 I = 0 ; iがN <I ++は) 5 運[I] =ランド()%のNUM。 6 のために(int型 i = 0 ; iがn <; I ++ ) 7 用(INT J = I + 1、J <N; jは++ ) 8 であれば(運[I] == 運[J]){ 9 はk = 1。破ります; 10 } 11 } ながら(K)。
再抽出するかどうかを決定するために同じ番号が存在するか否かを検出することによりアウト。
しかし、明らかに、このアプローチは非効率的です。
だから、繰り返しなし同じ番号ことを確実にするために描かれたの数を変更する、あなたは同じ番号を取り下げるよう検討してください。
そう:
1 ため(int型 i = 0 ; iがn <; iは++ ){ 2 にsrand((二重)時間(0 ))。 3 運[I] =ランド()%のNUM。 4 int型 J = 0、K = 0 。 5 のための(、J <I、J ++ ) 6 場合(運[I] == 運[J]){ 7 はk = 1 。 8 一方、(K){ 9 にsrand((二重)時間(0 ))。 10 運[I] =ランド()%NUM; 11 であれば(運[I] =!運[J]){ 12 のint T = 0 。 13 のために(; T <I、T ++ ) 14 であれば(運[T] ==運[i])とブレーク。 15 であれば(T == I)K = 0 。 16 } 17 } 18 } 19 }
しかし、ときに、少なくとも40 + sのポンプ40、
非効率性は未解決のまま。
そう最適化アルゴリズム、C(N)(m)を用いて、= C(MN)(M)、次の追加:
1 であれば(N <= NUM / 2 || N <= NUM / 2 + 1 ){ 2 FUN1(運、N、日付、NUM)。 3 fun2(運、N)。 4 } 5 他{ 6 int型 tluck [num- N]。 7 FUN1(tluck、num- N、日付、NUM)。 8 fun2(tluck、num- N)。 9 INT tluckn = 0、luckn = 0 。 10 のために(int型 I = 0 ; iがN <I ++は{) 11 一方(luckn ==tluck [tluckn]) 12 luckn ++ 。 13 運[I] = luckn。 14 luckn ++ ; 15 } 16 }
FUN1()は乱数を抽出する機能であり、fun2()は、番号抽出一種です。
しかし、この一時的なソリューションを提供します。
問題はどこにありますか?
繰り返しの回数がで描画されます。
数nを圧送するために、最も可能性が高い以上n回を吸っ。
だから私は、合計数のうち支配スモークアイデアを持っていたし、残りの数字を抽出します。
1つの 空隙 FUN1(int型の運[]、int型 nは、INTの NUM、int型、Iをint型のすべて[]){ 2 あれば(私は< N){ 3 にsrand((二重)時間(0 ))。 4 INT T =ランド()%のNUM。 5 運[I] = すべての[T]。 6 用(INT ; J <num- J = T 1 ; J ++ ) 7 すべて[J] =すべて[J + 1 ]。 8 FUN1(運、N、num- 1、I + 1、すべて); 9 } 10 } 11 ...... 12 ...... 13 ...... 14 INT すべて[NUM]。 15 のために(int型 I = 0 ; I <NUM; iが++ ) 16 すべて[I] = iは、 17 FUN1(運、N、NUM、0、すべて)。
すべての[]のすべての番号を格納するための、
誰もが2つのシリアル番号を持っています、
一つは、クラスのシリアル番号であり、
他には、アレイ内の「部屋番号。」
そして、毎回私たちは部屋番号をポンピングしています。
一人一人を描いた後に、この人はキックオフ、その後、時間の残りの部分は空席を埋めるために「部屋」を前方に移動するために、部屋の更新の人々が実現します。
再び、ポンピングした後、次のラウンドを描画するために人々を残しました。
なぜなら
INT I =ランド()%のNUM。
NUMの値が変更されている、では、乱数は常に変化し、リフレッシュを実現します。
部屋番号1、例えば、「部屋」で描かれています、
しかし、部屋の中の人が交換されている、それが同一人物の外ではありませんので。
この最適化は唯一の人々を描くために必要な達成することができた後、nはn回喫煙1S内に圧縮40倍に延伸。