我如何制作随机浮点数但要检查是否没有相同的数字?
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();
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();