2010-07-10 14 views
5

C# w/XNA'da Pong üzerinde çalışıyorum.C# ile rasgele sayıları nasıl kullanabilirim?

Topun ribaundlara mı yoksa bir açıyla mı, bir rakete vurduğunda topun ne kadar hızlı hareket edip etmediğini belirlemek için rastgele bir sayı (bir aralık dahilinde) kullanmak istiyorum.

Nasıl uygulanacağını bilmek istiyorum.

+10

açısı ve hız topu raket vurur nasıl belirlenir olmamalı mı? Rastgele yaparsanız, kullanıcılarınızın topun nereye gittiğini tahmin etmeleri zor olacak. –

+1

@Esteban Xtreme Pong değilse! – Grokodile

+0

Halihazırda, topun vurduğunda hareket etmesine bağlı olarak top ribaundlar. Ama ne kürek hareket etmediyse, top hiçbir değişiklik olmadan düz giderdi. Açıyı değiştirmek için rasgele bir sayı kullanmak istedim. – Slateboard

cevap

14

Random sınıfını kullanın.

Random r = new Random(); 
int nextValue = r.Next(0, 100); // Returns a random number from 0-99 
+3

Sadece bir * tek örnek * Rastgele (iş parçacığı başına) oluşturmalısınız. Basit, tek iş parçacıklı oyunlarda, türetilmiş Oyun sınıfının bir 'public static readonly' üyesi olmak genellikle yaptığım şeydir. Ayrıca bkz. Jon Skeet'in yanıtı: http://stackoverflow.com/questions/3217651/how-do-i-use-random-numbers-in-c/3218084#3218084 –

1
Random rnd = new Random(); 
rnd.Next(minValue, maxValue); 

yani

rnd.Next(1,10); 
1

kullanım olup aralığında bir değere, bir dakika sürer ve maksimum ve döner Rastgele nesnenin Next yöntemi:

var random = new Random();  
int randomNum = random.Next(min, max); 
1

Örneğin Random sınıfını tüm Diğerleri öneren, Random sınıf sadece psuedo-rasgele sayı üretimi kullanır. System.Security.Cryptography ad alanında bulunan RandomNumberGenerator, gerçek rasgele sayılar oluşturur.

Nasıl Kullanılır:

RandomNumberGenerator rng = RandomNumberGenerator.Create(); 
byte[] rand = new byte[25]; //Set the length of this array to 
          // the number of random numbers you want 
rng.GetBytes(rand); 

Fazla Bilgi: http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator(v=VS.80).aspx

+0

RandomNumberGenerator soyut bir sınıftır. :) Bu sınıftan türetilen RNGCryptoServiceProvider kullanın.Yine de hala sahte rastgele olan "kriptografik olarak güçlü" rasgele sayılar üretir. Ve http://stackoverflow.com/questions/418817/pros-and-cons-of-rngcryptoserviceprovider göre, RNGCryptoServiceProvider bu konuda daha yavaş ve aşırı. –

+0

Bu daha rasgele olacak ancak bir performans isabeti olabilir, bu nedenle buna göre dengeleyin. Bu rasgelelik miktarına ihtiyacınız olmayabilir ve aynı zamanda rastgele – TJB

+0

olarak kullanmak kadar kolay olmayabilir. Dürüst olmak gerekirse, muhtemelen sadece Rastgele kullanıyorum. –

7

sen kriptografik numaralar gerekmedikçe, Random sizin için iyi olmalı ... ama farkında olmak iki FRİKİKLERİNDEN vardır:

  • Her ihtiyaç duyduğunuzda yeni bir örnek oluşturmamalısınız. Bir tohum belirtmeden bir örnek oluşturursanız, o zaman geçerli zamanı tohum olarak kullanır - bu, hızlı bir şekilde birkaç örnek oluşturursanız, birçoğunun aynı sayı dizisini üreteceği anlamına gelir. Genellikle, Random uzun süreli bir örnek oluşturur ve yeniden kullanırsınız.
  • İş parçacığı güvenli değildir. Birden fazla ileti dizisinden rasgele sayılar oluşturmanız gerekiyorsa, iş parçacığı başına bir örnek oluşturmayı düşünmelisiniz. Daha fazla bilgi için this blog post'u okuyun, ancak yorumları da okuduğunuzdan ve çok yararlı bilgilere sahip olduğundan emin olun. İşte
+0

+1. Mükemmel ipuçları; İnsanların tekrar tekrar bu zamana kadar ısırıldıklarını gördüm. Benim en sevdiğim hata w/Rastgele, insanlar bunu sıkı bir döngü içinde başlattığında ve bunu d/'DateTime.Now 'un, sorunu çözecek umuduyla doldurmasıdır. :) –

0

benim rastgele jeneratör

private static Random rnd = new Random(Environment.TickCount); 

private int RandomNum(int Lower, int Upper) 
{ 

return rnd.Next(Lower, Upper);//MyRandomNumber; 

} 
İlgili konular