Генерация случайных чисел для нескольких объектов - PullRequest
4 голосов
/ 21 января 2012

Итак, я пытаюсь создать матричную программу с «кодом дождя».Все шло хорошо, пока я не решил бросить все строковые экземпляры в список и извлечь / обновить из него.Чтобы добиться правильного эффекта, мне нужно рандомизировать несколько вещей.

Все строки создаются и сохраняются в списке, который вы видите здесь в цикле for.Интервал и случайные числа пониженной скорости изменяют скорость падения строки и скорость вращения отдельных символов в листе спрайта.

По какой-то причине, я просто получаю текстовую стену, которая падает сразу и все спрайты вращаются с одинаковой скоростью.Классы и их соответствующие функции работают ... поэтому вопрос в том, что я делаю неправильно с моей инициализацией случайного числа?

for (int i = 0; i < (wWidth / 30); i++)
{
    Random random = new Random(new System.DateTime().Millisecond);
    float randInterval = NextFloat(random);
    int dropSpeed = random.Next(1, 7);
    _msList.Add(new MatrixString(chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10));
    xOff = i * 32;
}

Ответы [ 2 ]

6 голосов
/ 21 января 2012

Вам необходимо создать экземпляр random вне цикла for:

Random random = new Random(new System.DateTime().Millisecond);
for (int i = 0; i < (wWidth / 30); i++)
{
    float randInterval = NextFloat(random);
    int dropSpeed = random.Next(1, 7);
    _msList.Add(new MatrixString(  
                chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10));
    xOff = i * 32;
}

В коротком цикле заполнения, заполнение с помощью new System.DateTime().Millisecond создаст такое же начальное значение. Отсюда и то же случайное число.

2 голосов
/ 21 января 2012

Ваш цикл "быстрый", поэтому new Random(new System.DateTime().Millisecond) всегда будет давать тот же результат, так как каждый цикл быстрее 1 мс - должно работать следующее:

Random random = new Random(new System.DateTime().Millisecond);
for (int i = 0; i < (wWidth / 30); i++)
{
    float randInterval = NextFloat(random);
    int dropSpeed = random.Next(1, 7);
    _msList.Add(new MatrixString(chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10));
    xOff = i * 32;
}
...