2014-09-27 41 views
0

所以,我試圖製作一個需要隨機彩色圖片框的遊戲。我一直試圖製作隨機顏色生成器,但我遇到了一個我無法解釋的問題。RNG在循環中第二次迭代後給出相同的數字

運行此代碼時(內Form1_Load事件的):

for(int i=0; i<6, i++) 
{ 
    DateTime moment = DateTime::Now; 
    Random^RNG=gcnew Random(moment.Millisecond); 
    color[i]=RNG->Next(16); 

    if(color[i]<=9) 
    { 
     colorStr[i]=color[i].ToString(); 
    } 
    else if(color[i]==10) 
    { 
     colorStr[i]="A"; 
    } 
    else if(color[i]==11) 
    { 
     colorStr[i]="B"; 
    } 
    else if(color[i]==12) 
    { 
     colorStr[i]="C"; 
    } 
    else if(color[i]==13) 
    { 
     colorStr[i]="D"; 
    } 
    else if(color[i]==14) 
    { 
     colorStr[i]="E"; 
    } 
    else if(color[i]==15) 
    { 
     colorStr[i]="F"; 
    } 
    FullColor+=colorStr[i]; //FullColor was initialized with a value of "#"; 
} 

this->textBox1->Text=FullColor; 
this->Player->BackColor = System::Drawing::ColorTranslator::FromHTML(FullColor); 

文本框顯示或者所有相同的數量(即#000000),或所述第一數量將是唯一的,但其他五個會相等(即#A22222)。

+0

你巨大的if-else鏈可以從數爲十六進制字符串的簡單轉換來代替。 – chris 2014-09-27 15:39:05

回答

1

Random發電機不應該每次重新創建。試着做一次,在循環之前:

Random^RNG=gcnew Random(moment.Millisecond); 
for(int i=0; i<6, i++) 
{ 
    .... 

(在你的情況,似乎moment.Millisecond是順序調用相同的,但即使是不同的,是不應該的發電機重新。 。-created)


取而代之的是循環的,你可以考慮下面的代碼:

Random^ RNG = gcnew Random(); // somewhere at the beginning 
.... 
int color = RNG->Next(0x1000000); 
String^ colorStr = color.ToString("X6"); 
+0

啊......修好了,謝謝! – TheMohawkNinja 2014-09-27 15:42:53

+0

@TheMohawkNinja它可能是你不需要整個循環和手動'10-> A'格式。我用提案更新了這個帖子。 – AlexD 2014-09-27 15:44:54

相關問題