如何防止同一对象连续两次从数组中选取

时间:2017-04-30 15:31:38

标签: c# list unity3d random object-pooling

我有一个问题,想知道如何从列表的最后一次更新中没有选择的对象中随机获取一个对象。当这个随机实例化的对象产生并达到某个y值时,它将自己设置为非活动状态。因此,当此对象不活动时,它将通过一个数组并随机选择另一个对象。但是,我不想包含上一个活动对象。

示例:蓝球首先是活跃的。在Y轴上移动。变得不活跃。下一个对象spawn应该没有机会成为一个蓝色的球。任何想法和帮助将不胜感激。

我的代码在

下面
    val rows = sc.makeRDD(Seq(Row("Keanu", "Matrix")))
    val schema = StructType(Seq(StructField("name", DataTypes.StringType), StructField("title", DataTypes.StringType)))
    val df = new SQLContext(sc).createDataFrame(rows, schema)
    Neo4jDataFrame.mergeEdgeList(sc, df, ("Person",Seq("name")),("ACTED_IN",Seq.empty),("Movie",Seq("title")))
    val edges : RDD[Edge[Long]] = sc.makeRDD(Seq(Edge(0,1,42L)))
    val graph = Graph.fromEdges(edges,-1)
    assertEquals(2, graph.vertices.count)
    assertEquals(1, graph.edges.count)
    Neo4jGraph.saveGraph(sc,graph,null,"test")

    val it: ResourceIterator[Long] = server.graph().execute("MATCH (:Person {name:'Keanu'})-[:ACTED_IN]->(:Movie {title:'Matrix'}) RETURN count(*) as c").columnAs("c")
    assertEquals(1L, it.next())
    it.close()

2 个答案:

答案 0 :(得分:1)

尝试linq:

spplot(r,scales=list(x=list(x.scale,labels=c(seq(1,7,1))), y=list(y.scale,labels=c(seq(2001,2015,1))),col.regions =colfunc,at=seq(100, 170, len=100), xlab = "Elevation Zone", ylab = "year")

答案 1 :(得分:1)

每次生成随机数时,您需要将随机数存储到变量(lastRandomNum)。现在,使用下面的函数可以生成exclusion的随机数。

int RandomWithExclusion(int min, int max, int exclusion)
{
    var result = UnityEngine.Random.Range(min, max - 1);
    return (result < exclusion) ? result : result + 1;
}

您将0传递给min,然后theObjectballPools.LengthchangingBalls.Count传递给max,最后传递lastRandomNum值到排除参数。

您还需要一个boolean变量来确定这是否是第一次运行。如果这是第一次运行,请使用Unity的Random.Range功能,然后将firstRun设置为false。如果不是firstRun,请使用此答案中的RandomWithExclusion函数并传入lastRandomNum值以将其排除。另外,将生成的随机数存储到下一帧要使用的lastRandomNum变量中。

以下是我上面所说的简化版。您必须将其合并到您的代码中。

GameObject[] yourItem = null;
bool firstRun = true;
int lastRandomNum = 0;

void Update()
{
    if (firstRun)
    {
        firstRun = false;
        //First run, use Random.Range
        lastRandomNum = UnityEngine.Random.Range(0, yourItem.Length);
    }
    else
    {
        //Not First run, use RandomWithExclusion
        lastRandomNum = RandomWithExclusion(0, yourItem.Length, lastRandomNum);
    }

    //Do something with the lastRandomNum value below

    newBall = theObjectballPools[lastRandomNum].GetPooledObject();
}

int RandomWithExclusion(int min, int max, int exclusion)
{
    var result = UnityEngine.Random.Range(min, max - 1);
    return (result < exclusion) ? result : result + 1;
}