使用Random.range生成级别no而不重复

时间:2016-02-10 11:08:30

标签: c# unity3d

我尝试使用递归来解决手头的问题,如下所示,

int newlevelgen()
{
    int exampleno = Random.Range (1,4);
    if (exampleno != lastlevelno)
    {
        lastlevelno = exampleno;
        return exampleno;
    }
    else
    {
        newlevelgen();
    }
    return exampleno;
}

这是我上面的代码,我想要做的是生成新的数字而不重复前一个,但这根本不起作用。救命啊!

3 个答案:

答案 0 :(得分:0)

让我先说一下,以下是对已发布的原始方法的问题的答案。它远不是获得理想结果的最佳方式,但这不是这个答案的重点。是的,递归将有可能继续进行几次调用。 33%的机会需要另一个递归调用,但这并不意味着无限循环的33%因为需要X递归调用的可能性是0.33 ^ X所以达到3个递归调用的可能性仅为0.33 ^ 3~ = 0.036。 不过,建议采用不同的方法。以Joe Blow的答案为例。

您的递归存在问题。如果newlevelgen()exampleno相同并始终返回(可能重复的)lastlevelno,则您没有使用对exampleno的递归调用会给您的新值值。将其更改为:

int newlevelgen()
{
    int exampleno = Random.Range (1,4);
    if (exampleno != lastlevelno)
    {
        lastlevelno = exampleno;
        return exampleno;
    }
    else
    {
        return newlevelgen();
    }
}

答案 1 :(得分:0)

这个想法是你得到a和b之间的值。如果该值大于等于先前值,则增加该值并返回该值。其他情况下,你按原样返回。

想一想,它确实有效。

\multirow

这是编程中非常着名的基本模式......

public int GetUniqueLevelInclusiveOrdinal(int a , int b, int previous){

    // given the ordinal numbers from a to b INCLUSIVE, 
    // so including a and b,
    // (*** NOTE, no random int calls in Unity or any system
    // work inclusively so take care ***)
    // choose one of the numbers from a to b inclusive
    // but do not choose "previous"

    // which top index to use with Random.Range which is exclusive?
    int top = b+1;

    // everyday algorithm for excluding one item from a random run
    int topExcludeOne = top-1;

    int value = Random.Range(a, topExcludeOne);
    if (value >= previous) return value+1;
    else return value;
}

在Unity中,您必须使用扩展程序

int result = UnityEngine.Random.Range(0,highest-1);
if (result>=exclude)
   return result+1;
else
   return result;

获取随机索引0到99

public static int RandomIndexButNotThis(this int highest, int exclude)
    {
    if (highest<2) Debug.Break();

    int result = UnityEngine.Random.Range(0,highest-1);
    if (result>=exclude)
       return result+1;
    else
       return result;
    }

获取随机索引0到99,但不包括61

Random.Range(0,100)

获取随机索引0到9

100.RandomIndexButNotThis(61)

获取随机索引0到9,但不包括8

Random.Range(0,10)

如果是Unity新手,intro to extensions

答案 2 :(得分:0)

我创建了一个实用程序,可以轻松地处理无重复的随机数,平面分布的随机数和加权列表(包括通用属性抽屉!)。您可以在GtiHub上找到它并免费使用: https://github.com/khadzhynov/RandomUtils