C# 具有随机速度的二维粒子系统

C# 具有随机速度的二维粒子系统,c#,.net,gdi+,xna-4.0,C#,.net,Gdi+,Xna 4.0,我最近使用VisualBasic.Net编写了一个粒子系统,该系统在x和y方向以随机速度发射粒子,并受重力影响。我切换到C#Net并使用了XNA游戏工作室,这使得图形处理比GDI+更方便 我对C#的问题是随机数不够“随机”。我的粒子系统有2500个粒子,但您可以清楚地看到,这些粒子以网格状的方式分布,间距约为100像素,而Visual Basic的Rnd()函数没有这个问题 VisualBasic做了什么而C#没有做什么,如何在C#中获得相同的结果 我曾尝试在游戏循环的不同阶段重新初始化随机数,

我最近使用VisualBasic.Net编写了一个粒子系统,该系统在x和y方向以随机速度发射粒子,并受重力影响。我切换到C#Net并使用了XNA游戏工作室,这使得图形处理比GDI+更方便

我对C#的问题是随机数不够“随机”。我的粒子系统有2500个粒子,但您可以清楚地看到,这些粒子以网格状的方式分布,间距约为100像素,而Visual Basic的Rnd()函数没有这个问题

VisualBasic做了什么而C#没有做什么,如何在C#中获得相同的结果

我曾尝试在游戏循环的不同阶段重新初始化随机数,但最终我的粒子要么停留在一个位置,要么在一个方向上以恒定流发射

这是我的C#代码:在程序启动后,首先调用LoadContent。我使用毫秒作为种子,这样我每次都以不同的配置开始

下一次重新设定种子是在渲染之前在系统上完成所有计算之后。我尝试的另一种选择是在计算出每100个粒子后重新播种,但没有任何差异

        protected override void LoadContent()
    {
        // Create a new SpriteBatch, which can be used to draw textures.
        spriteBatch = new SpriteBatch(GraphicsDevice);
        mousePos = Content.Load<Texture2D>("Point");
        spriteTex = Content.Load<Texture2D >("Point");
        rnd = new Random(a.Millisecond);
        for (int i = 0; i < spritePos .Length; i++)
        {
            newPos[i] = new Vector2(800, 450);
            spritePos[i] = newPos[i] ;
            Scale[i] = rnd.Next(100,500);
            renderCol[i] = new Color(rnd.Next(255), rnd.Next(255), rnd.Next(255), 1);
            spriteVelocity[i] = new Vector2((rnd.Next(2000)-1000)/100, -rnd.Next(500,1500)/100);
            Life[i] = rnd.Next(60);
            Rotate[i] = (rnd.Next(1000)-500) * 0.001f;
            RotateSpeed[i] = (rnd.Next(1000)-500) * 0.0001f;

        }

    }

在我的VB代码中,没有我调用随机函数的地方,我注意到如果我这样做,我的粒子具有相同的模式行为。请原谅所有奇怪的算法,它们都只是实验。

随机类确保伪随机性,如果这是您正在使用的。请看。

如果您发布了一些代码,我们可能会指出您在哪里为每个调用创建一个新的Random()对象

比如说,


看到代码后

您知道
(rnd.Next(2000)-1000)/100
是一个纯整数表达式吗?结果将转换为
浮点
,但始终以
##.0
结尾


在VB
I/J
中,产生一个双精度

好的,你要做的是修复它Charl,创建一个没有种子的随机对象(你就是这样),并反复使用它。比如:

const double max = 1000.0;
Random rand = new Random();     // Like mentioned, don't provide a seed, .NET already picks a great seed for you
for(int iParticle = 0; iParticle < 2500; iParticle++)
{
    double x = rand.NextDouble() * max;     // Will generate a random number between 0 and max
    double y = rand.NextDouble() * max;
}
double x = (rand.NextDouble() * (max - min)) + min;

编辑:并确保使用double或float。整数仅为整数,双精度和浮点数可以存储实数,这可能是VB使用的。

您可以向我们展示您的代码(VB.net和C#)吗?您可以发布一段代码吗?也就是说,初始化新粒子并设置其速度的代码。还要确保没有为要创建的每个随机数创建新的
Random
实例。((rnd.Next(2000)-1000)/100使用Random.Next(int maxValue)它会生成介于0和maxValue之间的随机整数。我认为这可能是网格状外观的原因。请尝试random.NextDouble()谢谢,但在循环中声明随机数只会使我的粒子看起来"环绕原点旋转,它根本不移动。这就是为什么我如此困惑,任何试图纠正我的困境的尝试都只会使它恶化,但我确信有一个解决方案。是的,我尝试了John McD的答案,确实是整数给了我问题,C#比VB更抱怨类型转换。注意:如果你真的需要一个整数值,比如对于颜色,使用rand。Next(255)是完美的,这是你应该使用的。非常感谢,这是完美的解决方案!所以整数是问题所在。对于颜色,我不介意,在那里很难看到任何图案,但现在我的粒子实际上是“足够随机的”.我在这个论坛上读了很多关于随机数和CSRNG的内容,在统计学方面,我们还了解了伪随机数,它们实际上不是随机的。让我感到困扰的是,简单的VB函数Rnd()提供了足够的结果,但C#没有。它们都是.Net,所以我认为它们将使用相同的算法,但C#没有Rnd()函数。
double x = (rand.NextDouble() * (max - min)) + min;