C # / XNA создание псевдослучайного числа - PullRequest
5 голосов
/ 03 октября 2011

Процесс создания случайных чисел в c # / XNA довольно быстр и прост, однако, возможно, это худший генератор случайных чисел, который я когда-либо видел.Есть ли лучший способ, который легко реализовать для c # / XNA?

rand.Next () просто не соответствует моим потребностям.

from:

static privateRandom rand = new Random ();

Я произвольно размещаю объекты по всей моей программе.иногда 10, иногда 200.

При вызове случайных объектов (x val и y val оба случайны на 2d плоскости), они группируются.Код генерации чистый, он называется хорошим, повторяется чисто и получает новое случайное число с каждым значением.Но они группируются, заметно плохо, что не очень хорошо со случайными числами в конце концов.Я промежуточный навык с c #, я перешел с as3, который, кажется, лучше справлялся со случайностью.

Я хорошо знаю, что они псевдослучайны, но в C # в системе Windows группировка гротескна.

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Можете ли вы использовать System.Security.Cryptography.RandomNumberGenerator из XNA?

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

rand.GetBytes(bytes);

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

Чтобы получить значение в диапазоне мин / макс:

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);
}
1 голос
/ 04 октября 2011

Это также может зависеть от того, как вы используете System.Random.Как правило, не рекомендуется создавать новые экземпляры Random снова и снова, так как Random объекты, созданные примерно в одно и то же время, с большой вероятностью будут засеваться с одним и тем же случайным числом (по умолчанию времяиспользуется в качестве начального числа.) Вместо этого создайте один экземпляр Random и используйте только этот экземпляр во всей вашей программе.

Если целью не является безопасность, что, вероятно, здесь не так, вам будет лучше, просто используяSystem.Random.

1 голос
/ 03 октября 2011

Для своего проекта я использую простой алгоритм XOR.Я не знаю, насколько хорошо он распределяет числа, но это легко реализовать:

http://www.codeproject.com/KB/cs/fastrandom.aspx

...