RNG在循环中第二次迭代后给出相同的数字

时间:2014-09-27 15:26:28

标签: random colors c++-cli backcolor

所以,我正在尝试制作一款需要随机彩色图片盒的游戏。我一直在尝试制作随机颜色生成器,但我遇到了一个我无法解释的问题。

此代码运行时(在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)。

1 个答案:

答案 0 :(得分:1)

每次都不应重新创建

Random生成器。在循环之前尝试做一次:

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

(在你的情况下,似乎顺序调用的moment.Millisecond是相同的。但即使它不同,也不应该重新创建生成器。)


您可以考虑以下代码而不是循环:

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