Подтвердить что ты не робот

С# Случайные кординаты линейны

Мой код состоит в том, чтобы генерировать случайные сердечники lat и долго в пределах границы:

        Random lastLat = new Random();

        Random lastLon = new Random();

        for (int i = 0; i < 50; i++)
        {
            int lat = lastLat.Next(516400146, 630304598); //18.51640014679267 - 18.630304598192915

            int lon = lastLon.Next(224464416, 341194152); //-72.34119415283203 - -72.2244644165039

            SamplePostData d0 = new SamplePostData();
            d0.Location = new Location(Convert.ToDouble("18." + lat), Convert.ToDouble("-72." + lon));
            AddPushpin(d0);

        }

Мой вывод выглядит следующим образом: http://img263.imageshack.us/img263/7504/capturerkv.png http://img263.imageshack.us/img263/7504/capturerkv.png

Что-то не так с тем, как генерируются мои номера?

4b9b3361

Ответ 1

Ответ Jørn дал проблему, но не решение: просто используйте один экземпляр Random:

Random rng = new Random();

for (int i = 0; i < 50; i++)
{
    int lat = rng.Next(516400146, 630304598);
    int lon = rng.Next(224464416, 341194152);
    SamplePostData d0 = new SamplePostData();
    d0.Location = new Location(18d + lat / 1000000000d,
                               -72d - lon / 1000000000d);
    AddPushpin(d0);
}

(Я тоже изменил способ использования результата - нет необходимости конвертировать в строку и из нее, чтобы добиться того, чего вы хотите. Альтернативой может быть вызов Random.NextDouble вместо этого и умножение на размер нужный диапазон, затем добавьте базовое значение.)

Если вы вызываете процедуру несколько раз, вы, вероятно, должны использовать один экземпляр Random для этих нескольких вызовов. Остерегайтесь: Random в .NET не является потокобезопасным. В идеале вы должны иметь один экземпляр для каждого потока. Дополнительную информацию о том, как обращаться с Random, см. В статье о случайности.

Ответ 2

Вы инициализируете оба экземпляра Random без явного семени, заставляя их возвращать один и тот же поток псевдослучайных чисел. То, что вы делаете сейчас, эквивалентно использованию DateTime.Now в качестве семени для обоих экземпляров. Поскольку современные компьютеры имеют тенденцию быстро выполнять код, вы получаете одно и то же семя в обоих экземплярах.

Если вы используете один экземпляр Random для генерации как lang, так и long, вы должны увидеть гораздо более "случайный" дистрибутив.

Ответ 3

Нельзя использовать два разных объекта Random. Нарисуйте как широту, так и долготу от того же Random.

Random random = new Random();

for (int i = 0; i < 50; i++)
{
    int lat = random.Next(516400146, 630304598); //18.51640014679267 - 18.630304598192915
    int lon = random.Next(224464416, 341194152); //-72.34119415283203 - -72.2244644165039

    SamplePostData d0 = new SamplePostData();
    d0.Location = new Location(Convert.ToDouble("18." + lat), Convert.ToDouble("-72." + lon));
    AddPushpin(d0);
}

Ответ 4

Ваша проблема заключается в том, что вы одновременно создаете два объекта Random, заставляя их засеять почти одним и тем же семенем времени.

Используйте только один объект.