2011-10-02 8 views
5

Proces C#/XNA do tworzenia liczb losowych jest dość szybki i łatwy, jednak jest to prawdopodobnie najgorszy generator liczb losowych, jaki kiedykolwiek widziałem. Czy istnieje lepsza metoda, która jest łatwa do wdrożenia dla C#/XNA?Tworzenie numeru pseudolosowego C#/XNA

rand.Next() tylko nie pasuje do moich potrzeb.

od:

statycznym prywatnym Losowe rand = new random();

Losowo umieszczam obiekty na całym moim programie. czasami 10, czasami 200.

Podczas wywoływania losowych obiektów (wartości x i y val są losowe na płaszczyźnie 2d), grupują się. Kod generujący jest czysty i nazywa go dobrze, iteruje czysto i pobiera nową losową liczbę z każdą wartością. Ale grupują się, zauważalnie źle, co nie jest dobre z przypadkowymi liczbami. Jestem średniozaawansowany z C#, przeszedłem z as3, który wydawał się lepiej radzić sobie z przypadkowością.

Dobrze wiem, że są one pseudolosowe, ale C# w systemie Windows, grupa jest groteskowa.

+0

o jaki proces generowania liczb losowych się powołujesz? 'System.Random'? –

+0

Jakie są Twoje potrzeby? – PostMan

+0

Zaktualizowałem, dodając nieco więcej informacji. I obowiązkowe jęki i jęki. – SimpleRookie

Odpowiedz

2

Czy można użyć System.Security.Cryptography.RandomNumberGenerator z XNA?

var rand = RandomNumberGenerator.Create(); 
byte[] bytes = new byte[4]; 

rand.GetBytes(bytes); 

int next = BitConverter.ToInt32(bytes, 0); 

Aby uzyskać wartość w przedziale min/max:

static RandomNumberGenerator _rand = RandomNumberGenerator.Create(); 

static int RandomNext(int min, int max) 
{ 
    if (min > max) throw new ArgumentOutOfRangeException("min"); 

    byte[] bytes = new byte[4]; 

    _rand.GetBytes(bytes); 

    uint next = BitConverter.ToUInt32(bytes, 0); 

    int range = max - min; 

    return (int)((next % range) + min); 
} 
+0

Jak ustawić minuty i maksimum dla tej metody? – SimpleRookie

+1

Czy możesz podać przykład wartości minimalnej/maksymalnej? –

+0

0-10, 1-200, -100-100, standardowe wyposażenie. – SimpleRookie

1

może również zależeć od tego jak używasz System.Random. Zasadniczo nie jest dobrym pomysłem tworzenie nowych instancji o numerach Random w kółko, ponieważ obiekty utworzone w tym samym czasie będą najprawdopodobniej obsadzone tą samą liczbą losową (domyślnie czas jest używany jako nasienie .) Zamiast tego utwórz pojedynczą instancję Random i użyj tylko tej instancji w całym programie.

Jeśli celem nie jest bezpieczeństwo, co prawdopodobnie nie ma miejsca, lepiej będzie po prostu użyć System.Random.