私は質問を誤解している可能性が...
同じようなことを避けるための問題のカラーは、時間の経過と共に生成されるKManの回答を参照してください。私は、最初に新しいジェネレータを生成するのではなく、以前に使用された発電機と同じ種子を有する発電機を製造する危険性を回避する。
行に2つの「類似の」色を描かないようにするには、次のような対応が必要です。行の2つの類似色を回避することは、いくつかの数学的なロジックの使用
- のいずれかを意味し(ただし、使用する機能がまともな乱数発生器として、すべての可能な色のスペクトルをあろうカバーないという危険性がある)
- は真のランダムな色を描きますが、それらが似ているとみなされたときにそれらを拒否します(そして再試行します)。
第2のアプローチは、次のスニペットに示されているものです。
スタイルは長さで、色の受け入れ基準はやや恣意的ですが、これは良い考えを提供するはずです。
さらに、単一の乱数発生器(RNG)を再利用することにより、1は何とかRNGが毎回作成された、と偶然同じシードを使用した場合のシーケンスを繰り返すの危険を避ける...
const int minTotalDiff = 200; // parameter used in new color acceptance criteria
const int okSingleDiff = 100; // id.
int prevR, prevG, prevB; // R, G and B components of the previously issued color.
Random RandGen = null;
public string GetNewColor()
{
int newR, newG, newB;
if (RandGen == null)
{
RandGen = new Random();
prevR = prevG = prevB = 0;
}
bool found = false;
while (!found)
{
newR = RandGen.Next(255);
newG = RandGen.Next(255);
newB = RandGen.Next(255);
int diffR = Math.Abs(prevR - newR);
int diffG = Math.Abs(prevG - newG);
int diffB = Math.Abs(prevB - newB);
// we only take the new color if...
// Collectively the color components are changed by a certain
// minimum
// or if at least one individual colors is changed by "a lot".
if (diffR + diffG + diffB >= minTotalDiff
|| diffR >= okSingleDiff
|| diffR >= okSingleDiff
|| diffR >= okSingleDiff
)
found = true;
}
prevR = newR;
prevG = newG;
prevB = newB;
return String.Format("#{0:X2}{0:X2}{0:X2}", prevR, prevG, prevB);
}
出典
2010-12-03 06:38:54
mjv
を知るには、このリンク? – mjv
'Random()'関数は、***ランダムオブジェクトを再利用する限り、シードに基づいて乱数を生成します。たとえば、あなたのRandomColorクラスのコンストラクタで。 –
@Kman:そうです。しかし、統計的には、2回目に呼び出されたときに前の色と同じ色を生成するためのスニペットを防止するものは何もありません。実際、OPのスニペットで行われているように、3つのすべての値を同時に描画する場合と同じです。 – mjv