我如何制作随机浮点数,但要检查是否不会有相同的数字
本文关键字:不会有 是否 数字 检查 何制作 随机 浮点数 | 更新日期: 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);
}
我没有测试它,但我希望它能指引你找到答案。