链表中的随机性

时间:2012-11-19 01:32:33

标签: c++ data-structures random

我们可以在链表中获得随机性吗?我正在实施太空射击游戏,其中敌人应该随机射击子弹。我将敌人存放在链接列表中,我想随机选择一些敌人并从中射击。如何使用链接列表执行此操作?

4 个答案:

答案 0 :(得分:4)

在我的拙见中,随机化一个数字N然后进行N次射击并不是正确的方法。首先,这意味着一艘船将每一帧或每一个回合拍摄,这不一定是你想要的。

问题在于,无论屏幕上有多少敌人,射击的数量都是相同的。天气你有1个敌人或100个,所有敌人组合起来的射速将恰好是每回合/每帧一次射击,这对游戏设计毫无意义。这也意味着一艘船有时可能不会开2xN转弯(这有点像旧的武侠电影,坏人排队等候与'英雄'战斗,永远不会同时攻击)。

在我看来,好的方法是迭代船只,并以一定的概率使每个船只发射,最好是根据它最后一次发射。

long now = getCurrentTime... /*replace with real function*/
double epsilon = 0.0001; /*adjust as needed*/
while(current = enemyList.next()){
    if(Math.random() < epsilon * (now - current.lastFired))
    {
        current.fire();
        current.lastFired = now;
    }
}

如果你不使用那个机会,几乎没有任何点迭代N个元素。如果您使用列表,则意味着您计划迭代所有敌人并更新每个敌人。没有必要再次迭代他们的N,只是选择一个开火。

答案 1 :(得分:3)

你可以从第一个节点开始,然后调用n个“next”。

伪代码:

int num = Math.random() * myLinkedList.Count;
for( num ){
     myLinkedList.next();
}
return myLinkedList.currentNode;

也许你可以添加第二个容器,比如数组/ arraylist / vector,并从那里管理它...你可以随时问你的教授他/她是否可以。

答案 2 :(得分:2)

如果您确切知道列表中有多少项目,以及您希望每帧拍摄多少项目,实际上有一种相对简单的方法:对于每个项目,如果有 k N 列表中剩下的东西, p 项目留下来总共 Q ,然后当前项目应该拍摄概率 p / k - 然后应更新 k p 的值。这个伪代码看起来像:

myThing curThing = myList->head;
int objectsLeft = myListCount;
int shootersLeft = numShootersPerTick;
while ( curThing )
{
  if ( random(objectsLeft) < shootersLeft )
  {
    curThing->Shoot();
    shootersLeft--;
  }
  objectsLeft--;
  curThing = curThing->next;
}

请注意,我假设随机(N)返回0到N-1之间的数字;即N之一。虽然这个算法似乎应该选择具有不同概率的不同项目(毕竟,对于每个项目,随机数的检查正在改变!),可以在数学上显示这不仅选择具有正确概率的每个单独射击者,每个一套射手实际上同样可能。

答案 3 :(得分:0)

假设您要从列表中选择 k 随机元素( N 是总数)。选择的这些 k 元素应该是完全随机的。方法如下:

  1. 首先采用第一个 k 元素。
  2. 通过列表前进;当出现 m-th 元素时,生成随机整数0<=r<m

    • 如果r<k,则抛弃先前随机选择的元素,并将其替换为 m -th 元素。
  3. 一个带有概率和归纳论证的小算法表明这给了所有元素一个平等的机会。