Unity3d 单位随机范围不';I don’我没有按预期工作

Unity3d 单位随机范围不';I don’我没有按预期工作,unity3d,random,Unity3d,Random,我编写了一个小的克隆乒乓球。 开始时,球在田地中间产卵。 预期输出: 我想让球以45度角随机地飞到右上角和左上角,右下角和左下角 实际输出: 球只会飞到右上角和左下角 代码: public class BallController : MonoBehaviour { public float speed; private Rigidbody2D rb2d; private int counter; void Start() { rb2d = GetComponent<Rigid

我编写了一个小的克隆乒乓球。 开始时,球在田地中间产卵。 预期输出: 我想让球以45度角随机地飞到右上角和左上角,右下角和左下角

实际输出: 球只会飞到右上角和左下角

代码:

public class BallController : MonoBehaviour {

public float speed;
private Rigidbody2D rb2d;
private int counter;

void Start() {
    rb2d = GetComponent<Rigidbody2D> ();
    SetStartPosition();
}


public void SetStartPosition() {
    this.transform.position = new Vector3 (395f, 295f, 0f);
    int xVector = GetRandom ();
    int yVector = GetRandom ();
    float x = (float) xVector;
    float y = (float) yVector;
    Vector2 movement = new Vector2 (x, y);
    rb2d.velocity = movement * speed;
}

private int GetRandom() {
    int i = 0;
    do {
        Random.InitState((int) System.DateTime.Now.Ticks);
        i = Random.Range (-1, 2);
    } while (i == 0);
    return i;
}

}
公共类BallController:MonoBehavior{
公众浮标速度;
私有刚体2d rb2d;
专用int计数器;
void Start(){
rb2d=GetComponent();
设置起始位置();
}
公众职位(){
this.transform.position=新矢量3(395f、295f、0f);
intxvector=GetRandom();
int-yVector=GetRandom();
浮点x=(浮点)xVector;
浮动y=(浮动)yVector;
向量2移动=新向量2(x,y);
rb2d.velocity=运动*速度;
}
私有int GetRandom(){
int i=0;
做{
Random.InitState((int)System.DateTime.Now.Ticks);
i=随机范围(-1,2);
}而(i==0);
返回i;
}
}

删除行
Random.InitState((int)System.DateTime.Now.Ticks)
InitState
用于设置种子,通常每次仅一次即可获得相同的结果。似乎每次设置种子时,它都会返回相同的值(或相同的2个输出)。

删除行
Random.InitState((int)System.DateTime.Now.Ticks)
InitState
用于设置种子,通常每次仅一次即可获得相同的结果。似乎每次设置种子时,它都会返回相同的值(或相同的2个输出)。

Random.InitState用于为随机引擎种子。随机类中的随机数本身不是随机的,它们是确定的伪随机数;如果使用相同的种子调用Random.InitState,然后使用相同的参数调用Random.Range,则始终会得到相同的值。由于两次调用GetRandom的距离如此之近,因此可能是将引擎重新设定为相同的值(或接近该值),因此会得到一个与上一个相同的随机数。你应该只给引擎播一次种子。事实上,根据文件:

在使用随机数函数之前,种子通常从一些任意值(如系统时钟)设置。这可以防止每次玩游戏时出现相同的值运行,从而避免可预测的游戏性。但是,有时通过自己设置种子,根据需要生成相同的伪随机值运行是有用的


因此,除非您有充分的理由自己为引擎设定种子,否则您应该将其留给引擎。

Random.InitState用于为随机引擎设定种子。随机类中的随机数本身不是随机的,它们是确定的伪随机数;如果使用相同的种子调用Random.InitState,然后使用相同的参数调用Random.Range,则始终会得到相同的值。由于两次调用GetRandom的距离如此之近,因此可能是将引擎重新设定为相同的值(或接近该值),因此会得到一个与上一个相同的随机数。你应该只给引擎播一次种子。事实上,根据文件:

在使用随机数函数之前,种子通常从一些任意值(如系统时钟)设置。这可以防止每次玩游戏时出现相同的值运行,从而避免可预测的游戏性。但是,有时通过自己设置种子,根据需要生成相同的伪随机值运行是有用的


因此,除非你有充分的理由自己为引擎播种,否则你应该让引擎自己决定。

你确定吗?我尝试了代码,得到了所有可能的值。您可以在Start中使用for(inti=0;i<100;i++){print(GetRandom()+“”+GetRandom());}进行简单的测试。您不需要使用Random.InitState((int)System.DateTime.Now.Ticks)来设置种子,如果每次都想要相同的结果,您通常只设置一次。等等,我发现了问题。它是Random.InitState((int)System.DateTime.Now.Ticks)你确定吗?我尝试了代码,得到了所有可能的值。您可以在Start中使用for(inti=0;i<100;i++){print(GetRandom()+“”+GetRandom());}进行简单的测试。您不需要使用Random.InitState((int)System.DateTime.Now.Ticks)来设置种子,如果每次都想要相同的结果,您通常只设置一次。等等,我发现了问题。它是Random.InitState((int)System.DateTime.Now.Ticks)