我如何制作随机浮点数但要检查是否没有相同的数字?

How can i make random float numbers but to check that there will be no same numbers?

for(int i = 0; i < gos.Length; i++)
        {
float randomspeed = (float)Math.Round (UnityEngine.Random.Range (1.0f, 15.0f));
    floats.Add (randomspeed);
    _animator [i].SetFloat ("Speed", randomspeed);
        }

现在我得到的只是 1 到 15 之间的整数。我的意思是我没有得到像 1.0、5.4、9.8 或 14.5 这样的数字,这样的速度值合乎逻辑吗?如果是这样,我怎样才能使随机数也包括浮点数?

其次,我怎样才能确保没有相同的数字?

gos 长度为 15

你的第一个问题:如果你使用 Math.Round(),你永远不会得到像 5.4 这样的数字...

第二个问题:加号前可以先检查号码是否存在:

private float GenerateRandomSpeed()
{ return (float)UnityEngine.Random.Range (1.0f, 15.0f);}


for(int i = 0; i < gos.Length; i++)
    {
     float randomspeed= GenerateRandomSpeed();
     while (floats.any(x=>x==randomspeed)) 
         randomspeed=GenerateRandomSpeed();

     floats.Add (randomspeed);
     _animator [i].SetFloat ("Speed", randomspeed);
    }

我没有测试它,但我希望它能指导你找到答案。

您没有得到任何小数的原因是因为您使用的是 Math.Round,这会将浮点数提高到下一个整数或降低它。

至于是否合乎逻辑,depends.As对于你的情况,动画速度通常由浮动完成,因为它可以平滑地加速和减速。

还要回答您关于如何避免相同浮点数重复的问题。这本身就不太可能了,请尝试这样做:

for(int i = 0; i < gos.Length; i++)
{
   float randomspeed = 0f;
   // Keep repeating this until we find an unique randomspeed.
   while(randomspeed == 0f || floats.Contains(randomspeed))
   {
       // Use this is you want round numbers
       //randomspeed = Mathf.Round(Random.Range(1.0f, 15.0f));
       randomspeed = Random.Range(1.0f, 15.0f);
   }
   floats.Add (randomspeed);
   _animator [i].SetFloat ("Speed", randomspeed);
}

如另一个答案中所述,您没有得到小数值,因为您调用了 Math.Round(),它的明确目的是四舍五入到最接近的整数(当按照您的方式调用时)。

至于防止重复,我质疑是否需要确保不重复。首先,您选择的范围内的可能值的数量足够大,因此出现重复项的可能性 非常 很小。其次,您似乎正在为某些游戏对象选择随机速度,在我看来,在那种情况下,您偶尔会发现一对具有相同速度的游戏对象是完全合理的。

就是说,如果您仍然想这样做,我建议您不要使用其他答案推荐的线性搜索。游戏逻辑应该相当高效,在这种情况下,这意味着使用哈希集。例如:

HashSet<float> values = new HashSet<float>();

while (values.Count < gos.Length)
{
    float randomSpeed = UnityEngine.Random.Range(1.0f, 15.0f);

    // The Add() method returns "true" if the value _wasn't_ already in the set
    if (values.Add(randomSpeed))
    {
        _animator[values.Count - 1].SetFloat("Speed, randomSpeed);
    }
}

// it's not clear from your question whether you really need the list of
// floats at the end, but if you do, this is a way to convert the hash set
// to a list
floats = values.ToList();