Pergunta

Ok, então eu tenho um lance de dados aplicativo ...

Quando eu percorrer o código funciona normalmente e 'resultados' contém o número correto de resultados lance e eles parecem ser aleatória, quando eu deixar o código para executar e fazer exatamente a mesma coisa que produz um conjunto de números idênticos .

Eu tenho certeza que este é um erro lógico que não posso ver, mas mexer com ele por horas has not melhorou a situação, portanto, qualquer ajuda é muito apreciado pelos cuidados. :)

    class Dice
{

    public int[] Roll(int _throws, int _sides, int _count)
    {
        Random rnd = new Random();
        int[] results = new int[_throws];
        // for each set of dice to throw pass data to calculate method
        for (int i = 0; i < _throws; i++)
        {
            int thisThrow = Calculate(_sides, _count);
            //add each throw to a new index of array... repeat for every throw
            results[i] = thisThrow; 
        }

        return results;
    }


    private int Calculate(int _sides, int _count)
    {
        Random rnd = new Random();
        int[] result = new int[_count];
        int total = 0;
        //for each dice to throw put data into result
        for (int i = 0; i < _count; i++)
        {
            result[i] = rnd.Next(1, _sides);
        }
        //count the values in result
        for (int x = 0; x < _count; x++)
        {
            total = total + result[x];
        }
        //return total of all dice to Roll method
        return total;
    }
}
Foi útil?

Solução

Primeiro erro:. Nunca use várias instâncias do aleatório, use uma única instância, e passar que, juntamente com os outros parâmetros

Outras dicas

Quando você cria "Random rnd = new Random ();" é semeado no momento atual. Quando você depurar seu código (que leva tempo) que serão distribuídos de forma diferente a cada vez.

Criar uma instância de aleatório, e referência que em todos os lugares.

Você está criando uma classe aleatória cada vez que você precisa para criar um número. Fazendo isso vai lhe dar os resultados noz.

Veja aqui: DE MSDN

Este problema pode ser evitado através da criação de um único objeto Random em vez de vários.

Para melhorar o desempenho, criar um objeto Random para gerar muitos números aleatórios ao longo do tempo, em vez de criar repetidamente um novo aleatório objetos para gerar um número aleatório.

por exemplo. criar uma instância privada da Random ...

Além do que foi mencionado antes ...

Use aleatória para coisas como dados, jogos de cartas, a escolha de imagens aleatórias e assim por diante. Se você precisar criar um número aleatório para a causa de segurança, o uso System.Security.Cryptography.RandomNumberGenerator. Este exemplo simples mostra a criação de um número inteiro aleatório.

        RandomNumberGenerator gen = RandomNumberGenerator.Create();
        byte[] myBytes = new byte[4];
        gen.GetBytes(myBytes);
        int myValue = (BitConverter.ToInt32(myBytes, 0));

NÃO use isto a menos que você tem uma necessidade de segurança. O desempenho é menor que a da classe Random. Eu suponho que você poderia usar isso para semente aleatória, mas isso pode ser um exagero.

EDIT: Ocorreu-me que eu nunca tinha testado isso. Um teste rápido desempenho mostrou o seguinte:

1.000.000 números aleatórios: RandomNumberGenerator: 2,6 segundos Aleatória:. .015 segundos

So Random é de cerca de 150 vezes mais rápido.

Dê o construtor Aleatório uma semente. Esse é o problema.

http://msdn.microsoft.com /en-us/library/aa329890%28VS.71%29.aspx

Random r = new Random(DateTime.Now.Millisecond);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top