我尝试使用递归来解决手头的问题,如下所示,
int newlevelgen()
{
int exampleno = Random.Range (1,4);
if (exampleno != lastlevelno)
{
lastlevelno = exampleno;
return exampleno;
}
else
{
newlevelgen();
}
return exampleno;
}
这是我上面的代码,我想要做的是生成新的数字而不重复前一个,但这根本不起作用。救命啊!
答案 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