2010-12-12 10 views
4

ビットマップを2つの異なる色でランダムにカバーするコードを設定しました。10回のうち7回は青、10回のうち3回は緑になります。しかし、それが完了すると、7つの青のピクセルを数回、次に3つの緑のピクセルを数回などとするように、非常に不規則に見えます。
例:
alt text 私のコードは次のとおりです。C#アプリケーションで乱数ピクセルの色がランダムでないのはなぜですか?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace FourEx 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Bitmap bmp = new Bitmap(canvas.Image); 
      System.Drawing.Imaging.BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, 800, 600), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
      unsafe 
      { 
       int tempy = 0; 
       while (tempy < 600) 
       { 
        byte* row = (byte*)bmpdata.Scan0 + (tempy * bmpdata.Stride); 
        for (int x = 0; x <= 800; x++) 
        { 
         Random rand = new Random(); 
         if (rand.Next(1,10) <= 7) 
         { 
          row[x * 4] = 255; 
         } 
         else 
         { 
          row[(x * 4) + 1] = 255; 
         } 
        } 
        tempy++; 
       } 
      } 
      bmp.UnlockBits(bmpdata); 
      canvas.Image = bmp; 
     } 
    } 
} 

追加情報が必要な場合は、私に知らせてください。

+1

'LockBits'と' unsafe'を使用してパフォーマンスを最適化していますか? [Bitmap.SetPixel'](http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.setpixel.aspx)を使用すると、これをもっと簡単に行うことができるようです。 –

+0

@Code Grey:Get/SetPixelのパフォーマンスは、画像操作を行う上で実際には貧弱です。これは、ピクセルごとの色が重要な大規模な画像生成に適したパフォーマンスを得るための非常に一般的な方法です。 –

+1

@Chris:私は認識しています。私はパフォーマンス上の理由からそれが実行されたのか、より単純な代替方法に気づいていないのかを尋ねました。あなたが言うように、私がやらなければならない画像操作が「大規模」であるかどうかに応じて、私は両方のアプリケーションでやりました。 'Form.Load'イベントのように、一度ランダムなイメージを作成しているのであれば、それを可能な限り一気に絞り込む必要はないでしょう。 –

答えて

11

移動このライン:最も外側のスコープへ

Random rand = new Random(); 

。これらをすばやく作成すると、多くの人が同じ時間シード(時計の精度のため)を取得し、同じ「ランダム」シーケンスを生成します。さらに、あなたはただ一つのランダムインスタンスしか必要としません...

private void Form1_Load(object sender, EventArgs e) 
{ 
    Bitmap bmp = new Bitmap(canvas.Image); 
    System.Drawing.Imaging.BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, 800, 600), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

    Random rand = new Random(); 

    unsafe 
    { 
    // .... 
+0

ありがとう、私はそれがそれに影響を与えるとは思わなかった。完全に動作:)。 – GunnarJ

+0

私たち(アプリケーション開発者)は、なぜランダムなシードインスタンスを作成するのですか?それを標準ライブラリそのもののようなものにするのはなぜですか?私はこのパターンを(私が覚えている限り、DOS用のQuickBasicで)初めて会ったので、これについて約20年前からすでに疑問に思っています。実際にはUnix系OSにはシステム全体の '/ dev/random'がありますが、なぜC#や他の言語でクロスプラットフォームの選択肢がないのですか? – Ivan

関連する問題