C#随机坐标是线性的

Sha*_*ean 12 c#

我的代码是在绑定中生成lat和long的随机坐标:

        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);

        }
Run Code Online (Sandbox Code Playgroud)

我的输出如下:http: //img263.imageshack.us/img263/7504/capturerkv.png http://img263.imageshack.us/img263/7504/capturerkv.png

我的数字生成方式有问题吗?

Jon*_*eet 7

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);
}
Run Code Online (Sandbox Code Playgroud)

(我也改变了使用结果的方式 - 没有必要转换为字符串和从字符串转换来实现你想要的.另一种方法是调用Random.NextDouble它并将其乘以所需范围的大小,然后添加基值.)

如果您多次调用例程,则应该使用Random跨多个调用的单个实例.请注意:Random在.NET中不是线程安全的.理想情况下,每个线程应该有一个实例.有关如何处理的更多详细信息,请参阅我的随机性文章Random.


Jør*_*ode 6

您正在初始化两个Random实例而没有显式种子,导致它们返回相同的伪随机数流.你现在正在做的,相当于DateTime.Now用作两个实例的种子.随着现代计算机倾向于执行代码快,你结束了在这两种情况下相同的种子.

如果您使用单个Random实例生成lang和long,则应该看到更多"随机"分布.

  • @Shawn Mclean:您认为在执行第1行和第2行之间的当前时间有多少变化? (3认同)
  • @Foxfire:不要将滴答计数器的*精度*与*精度*混淆.仅仅因为蜱发生并不意味着它们是可见的.尝试连续调用"Environment.TickCount"来填充列表,然后将它们打印出来......你会看到很多重复的值. (2认同)

Mar*_*ers 5

你不应该使用两个不同的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);
}
Run Code Online (Sandbox Code Playgroud)