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

本文关键字:不会有 是否 数字 检查 何制作 随机 浮点数 | 更新日期: 2023-09-27 17:59:17

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(),它的明确目的是四舍五入到最接近的整数(当以您的方式调用时(。

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

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

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();

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

至于它是否合乎逻辑,那就要看情况了。对于您的情况,动画速度通常由浮动来完成,因为它可以平滑地上下加速。

同时回答您关于如何避免同一浮动的重复的问题。。这本身就已经很不可能了,试着这样做:

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((,你永远不会得到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);
    }

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

相关文章: