2010-12-12 2 views
4

비트 맵 2 가지 색상을 무작위로 포함하도록 코드를 설정했습니다. 10 회 중 7 회는 파란색으로, 3 회는 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 Gray : 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 년 동안 이것을 궁금해왔다. 유닉스 계열 운영체제에는 실제로 시스템 전역'/ dev/random'이 있습니다. C# 및 다른 언어로 크로스 플랫폼 대안이없는 이유는 무엇입니까? – Ivan