【问题标题】:C# Random() isn't working very randomlyC# Random() 不是很随机地工作
【发布时间】:2013-06-06 17:46:45
【问题描述】:

快速提问

在我的游戏中,我目前必须在屏幕底部生成并向上移动的项目。一旦它们到达屏幕顶部或与玩家发生碰撞,它们就会消失,并且应该在屏幕底部沿 X 轴的随机点生成。第一个项目似乎总是在随机点生成,然而,第二个对象似乎总是在与第一个对象相同的点生成,尽管是使用单独的方法调用生成的。有任何想法吗?这是我正在使用的代码:

       public void ReSpawn()

        this.RandX = this.random.Next(30, 650);
        this.Position.X = RandX;
        this.Position.Y = 710;

        if (Object1.Position.Y <= -25) //If item reaches top of screen

                Object1.ReSpawn(); 

        if (Object1.rectangle.Intersects(Player.rectangle)) //Collision with player


                Object1.ReSpawn(); 

        if (Object2.Position.Y <= -25) //If item reaches top of screen

                Object2.ReSpawn();

        if (Object2.rectangle.Intersects(Player.rectangle)) //Collision with player


                Object1.ReSpawn(); 

声明使用:

    public Random random = new Random();
    public int RandX;

【问题讨论】:

  • 您在哪里以及如何声明您的 Random 对象?
  • 你是如何实例化你的变量 random 的?
  • 什么怪物吃了你的括号?
  • 抱歉,忘记添加声明了,刚刚编辑了
  • 而且它是在课程开始时,在任何方法等之前被删除的。

标签: c# random xna


【解决方案1】:

您的两个对象可能不共享 Random 对象。所以两个对象都会生成相同的随机数序列。

在两个对象之间共享一个Random 对象,它们应该生成不同的值。

编辑:

random设为静态,以便所有对象都使用它。

public static Random random = new Random();

【讨论】:

  • 这是正确的。 Random 的默认构造函数使用种子的当前时间。所以,如果同时实例化两个 Random 对象,它们会产生相同的随机序列。
【解决方案2】:

尝试播种随机数生成器

    Random rand1 = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);

http://msdn.microsoft.com/en-us/library/ctssatww.aspx

【讨论】:

  • 播种无济于事。默认情况下,随机实例是根据当前时间播种的,问题是 OP 很可能同时获取多个实例。
【解决方案3】:

如果你真的想要一个好的随机数生成器,我推荐System.Security.Cryptography.RandomNumberGenerator 而不仅仅是Random。不过,不确定它是否会影响性能。

【讨论】:

  • 在回答这个问题之前可能需要做更多的研究,Cryptography.RandomNumberGeneratorRandom 慢得多
  • 就像我说的,我不确定它是否会影响性能。但是,如果您确实想要以速度为代价获得更好的 RNG(例如,用于关卡生成或物品放置),我认为我的答案没有任何问题。
  • 这就是我的意思,我想你会在回答之前检查自己。
  • 我不确定“加密安全”是否真的映射到“更好”以用于游戏开发,性能问题除外。让您的关卡生成在原则上不可预测,而不仅仅是在实践中不可预测,真的有什么好处吗?
  • 并非如此,但它是另一种生成随机数的方法。我发现它比普通的 Random 更“随机”。
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多