С# Случайные кординаты линейны
Мой код состоит в том, чтобы генерировать случайные сердечники 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
Что-то не так с тем, как генерируются мои номера?
Ответы
Ответ 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, заставляя их засеять почти одним и тем же семенем времени.
Используйте только один объект.