排除负浮点数和正浮点数之间的随机范围内的范围。由 c# unity

Exclude range within random range between negative and positive float. c# unity

有一个变量,我在 -2.0f2.0f (Random.Range(-2.0f, 2.0f) 之间给出一个随机范围;在 Unity/C#) 中,但我不希望它在 -0.6f0.6f 之间选择一个数字。

我是怎么做到的?

http://docs.unity3d.com/ScriptReference/Random.Range.html

循环对我来说有点浪费。毕竟,您最终可能会生成一堆无法使用的数字。为什么不从两个允许范围内生成两个数字,然后 select 随机一个到 return?

var candidates = new[] {Random.Range(-2.0f, -0.6f), Random.Range(0.6f, 2.0f)};
return candidates.OrderBy(c => Random.Next()).First();

您也可以做一个随机数,然后随机决定是否应该 return 它是负数还是正数。下面的代码也避免了 OrderBy 方法,据我所知,该方法不适用于 Unity 和 iOS

var rand = Random.Range(0.6f, 2.0f);
if (Random.Range(0, 100) <= 50)
{
  rand = rand * -1f;
}
return rand;

另外,虽然严格来说,这超出了你原来问题的范围,但如果你不能假设两个范围是相同的(绝对值),而且你也不能使用 OrderBy,你可以写这样的东西这个:

var candidates = new[] {Random.Range(-2.0f, -0.6f), Random.Range(0.6f, 2.0f)};
var idx = Random.Range(0,2); // this should give you either 0 or 1
return candidates[idx];

怎么样:

var delta = Random.Range(-1.4f, 1.4f);
var result = delta >= 0 ? delta + 0.6f : delta - 0.6f;

或者也许:

var delta = Random.Range(-1.4f, 1.4f);
var abs = Mathf.Abs(delta);
var sign = Mathf.Sign(delta);

var result = sign*(0.6f + abs);

编辑:改变了周围的东西以避免使用三元运算符并删除了错误的评论。谢谢@sh1

凯西的回答看起来不错。我只是不知道如何让它与其他价值观一起工作。下面的答案提供了一个可重用的代码,可以轻松地与其他值一起使用。

它生成第一个数字。该数字将用于确定它是否应该生成一个低于您要排除的最小数字或一个数字高于您想要的最大数字排除。它生成的第二个数字是实际的随机数。

 float Range(float min, float max, float ignoreFrom, float ignoreToEnd)
 {
     int dirRand = UnityEngine.Random.Range(1, 3); //1 to 2 random number
     float finalRandomNum = 0;

     //If 1, generate number below ignoreFrom, min
     if (dirRand == 1)
     {
         ignoreFrom += 0.00001f; //To make make ignoreFrom exclusive (Remove if you want to include it)
         finalRandomNum = UnityEngine.Random.Range(ignoreFrom, min);
     }

     //If 2, generate number above ignoreToEnd
     else if (dirRand == 2)
     {
         ignoreToEnd += 0.00001f; //To make make ignoreToEnd exclusive (Remove if you want to include it)
         finalRandomNum = UnityEngine.Random.Range(ignoreToEnd, max);
     }
     return finalRandomNum;
 }

为了测试它,让我们在 -2.0f2.0f 之间生成 80 个随机数,排除最小值 -0.6f 和最大值 0.6f

for (int i = 0; i < 80; i++)
{
    Debug.Log(Range(-2f, 2f, -0.6f, 0.6f));
}