我的問題是,當我試圖使用Unity在隨機位置生成一些物件時,由于某些未知的原因,這些生成的物件的位置是相同的。
我試著在我的代碼中加入Thread.Sleep(),位置將是隨機的。
這里有一個例子:
class Program
{
static void Main(string[] args)?
{
var mytest = new Program()。
Console.WriteLine(mytest.test())。
Thread.Sleep(500)。
Console.WriteLine(mytest.test())。
Thread.Sleep(500)。
Console.WriteLine(mytest.test())。
Thread.Sleep(500)。
}
public int test()
{
Random random = new Random();
int testrandom = random.Next(5, 100) 。
return testrandom;
}
我不想一直使用Thread.Sleep(),有什么方法可以克服這個問題嗎?
在使用除錯時,我發現如果不使用Thread.Sleep(),區域變數testrandom會隨機更新為testrandom=30,testrandom=32,testrandom=13...,但結果卻不同,結果是testrandom=30,并且重復了3次。誰能告訴我為什么會發生這種情況?也許它運行得太快了?
uj5u.com熱心網友回復:
.NET隨機類是由系統時鐘播種的,如果沒有給出明確的種子,所以如果你在相隔很短的時間內創建新的實體,每個實體會給你相同的數字。這也是為什么在呼叫mytest.test()之間添加睡眠可以緩解問題的原因,因為在Thread.Sleep結束時,系統時鐘已經提前。
你應該重復使用同一個Random實體,并且每次都使用那個實體:
class Program
{
private Random random = new Random();
static void Main(string[] args)。
{
var mytest = new Program()。
Console.WriteLine(mytest.test())。
Console.WriteLine(mytest.test())。
Console.WriteLine(mytest.test())。
}
public int test()
{
int testrandom = random.Next(5, 100) 。
return testrandom;
}
另外,你可以將你的test()方法和Random實體宣告為靜態的,所以你不必創建Program-class的實體:
class Program
{
private static Random random = new Random()。
static void Main(string[] args)?
{
Console.WriteLine(test())。
Console.WriteLine(test())。
Console.WriteLine(test())。
}
public static int test()
{
int testrandom = random.Next(5, 100) 。
return testrandom;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/332966.html
標籤:
上一篇:如何使用Go優雅地決議URI?
