C# - Bloqueio do programa durante o runtime

Dark_Webster

Power Member
Boas. Estou a desenvolver um programa que gere números do euromilhões. Verifiquem o código e vejam se algo está a atrasar o programa. Ao randomizar uma chave ele bloqueia ao fazer a 6ªchave, ao randomizar números, bloqueia a segunda vez, e ao randomizar estrelas bloqueia imediatamente.

Então:

Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Euromilhões
{
    public partial class Euromilhões : Form
    {public Random randomizadornumeros = new Random();
        public Random randomizadorestrelas = new Random();
        public Euromilhões()
        {
            InitializeComponent();
        }

        private void Temporizador1_Tick(object sender, EventArgs e)
        {
            LabelData.Text = DateTime.Now.ToString();  
        }

        private void TimerLoad_Tick(object sender, EventArgs e)
        {
            GrupoNúmeros.Show();
            GrupoEstrelas.Show();
            LabelData.Show();
            TimerLoad.Stop();
        }

        private void Euromilhões_Load(object sender, EventArgs e)
        {
            LabelNomeUser.Text = "Olá " + Environment.UserName + "!";
            GrupoNúmeros.Hide();
            GrupoEstrelas.Hide();
            LabelData.Hide();
            TimerLoad.Start();
            Temporizador1.Start();
        }

        private void AlterarACorDoForm_Click(object sender, EventArgs e)
        {
            EscolhaDaCor.ShowDialog();
            this.BackColor = EscolhaDaCor.Color;
        }

        private void RandomizarChave_Click(object sender, EventArgs e)
        {
            RandomizarChave.Enabled = false;
            RandomizarNúmeros.Enabled = false;
            RandomizarEstrelas.Enabled = false;
            Numero1.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            Numero2.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            while (Numero2.Text == Numero1.Text) ;
            {
                Numero2.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            }
            Numero3.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            while (Numero3.Text == Numero2.Text && Numero3.Text == Numero1.Text) ;
            {
                Numero3.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            }
            Numero4.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            while (Numero4.Text == Numero3.Text && Numero4.Text == Numero2.Text && Numero4.Text == Numero1.Text) ;
            {
                Numero4.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            }
            Numero5.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            while (Numero5.Text == Numero4.Text && Numero5.Text == Numero3.Text && Numero5.Text == Numero2.Text && Numero5.Text == Numero1.Text) ;
            {
                Numero5.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            }
            Estrela1.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
            Estrela2.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
            while (Estrela2.Text == Estrela1.Text) ;
            {
                Estrela2.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
            }
            RandomizarChave.Enabled = true;
            RandomizarNúmeros.Enabled = true;
            RandomizarEstrelas.Enabled = true;
        }

        private void RandomizarNúmeros_Click(object sender, EventArgs e)
        {
            RandomizarChave.Enabled = false;
            RandomizarNúmeros.Enabled = false;
            RandomizarEstrelas.Enabled = false;
            Numero1.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            Numero2.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            while (Numero2.Text == Numero1.Text) ;
            {
                Numero2.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            }
            Numero3.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            while (Numero3.Text == Numero2.Text && Numero3.Text == Numero1.Text) ;
            {
                Numero3.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            }
            Numero4.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            while (Numero4.Text == Numero3.Text && Numero4.Text == Numero2.Text && Numero4.Text == Numero1.Text) ;
            {
                Numero4.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            }
            Numero5.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            while (Numero5.Text == Numero4.Text && Numero5.Text == Numero3.Text && Numero5.Text == Numero2.Text && Numero5.Text == Numero1.Text) ;
            {
                Numero5.Text = Convert.ToString(randomizadornumeros.Next(1, 50));
            }
            RandomizarChave.Enabled = true;
            RandomizarNúmeros.Enabled = true;
            RandomizarEstrelas.Enabled = true;
        }

        private void RandomizarEstrelas_Click(object sender, EventArgs e)
        {
            RandomizarChave.Enabled = false;
            RandomizarNúmeros.Enabled = false;
            RandomizarEstrelas.Enabled = false;
            Estrela1.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
            Estrela2.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
            while (Estrela2.Text == Estrela1.Text) ;
            {
                Estrela2.Text = Convert.ToString(randomizadorestrelas.Next(1, 9));
            }
            RandomizarChave.Enabled = true;
            RandomizarNúmeros.Enabled = true;
            RandomizarEstrelas.Enabled = true;
        }

        private void ExportarChave_Click(object sender, EventArgs e)
        {
            DialogGravarChave.ShowDialog();
            StreamWriter Chave = File.CreateText(DialogGravarChave.FileName);
            Chave.Write("Números:");
            Chave.WriteLine(Numero1.Text + " " + Numero2.Text + " " + Numero3.Text + " " + Numero4.Text + " " + Numero5.Text);
            Chave.Write("Estrelas:");
            Chave.WriteLine(Estrela1.Text + " " + Estrela2.Text);
            Chave.WriteLine("");
            Chave.WriteLine(DateTime.Now);
            Chave.Close();
        }
    }
}
Estarei a fazer algo mal? PS: Não liguem à extensão do código e talvez a complexidade que está no código, comecei em C# há coisa de 5 dias.

O RandomizarChave.Enabled = true; . o RandomizarNúmeros.Enabled = true; e o RandomizarEstrelas.Enabled = true; são apenas para desactivar botões da barra de menu.
 
Bem estive a testar, e sem os ";" que tinhas, funciona, agora reparei que na parte dos números costuma haver repetição! Dá uma vista de olhos nisso!
 
Muito obrigado, assim já não bloqueia :D.

Também já reparei que ele repete números. Existe alguma maneira diferente de impedir que se repitam, de uma maneira diferente da que fiz claro:D.

EDIT : Uso a mesma rotina de comparação em VB.NET e nunca repetiu um número.
 
Última edição:
Gerar numeros aleatorios depende do poder de computação. A unica soluçao que eu vejo é guardar os numeros que saem e pesquisar nessa estrutura de dados por numeros repetidos.
Agora, complexidades,... 1, 2, 3, numeros guardados, mas imagina que chegas a um ponto que tens mesmo muitos numeros, nao compensava.

É impossivel, nos dias de hoje (mas por enquanto :D), gerar numeros aleatorios puros. Qualquer sistema de numeros aleatorios que encontres ou, acabam ao fim de milhoes de vezes, criar um padrao ou repetem-se em demasia.
Ainda é um dos paradigmas, os numeros aleatorios puros. Quanto mais para criar um sistema computaciolnamente poderoso para o euro milhoes, nao digo impossivel :001:. Tal como nao consegues aleatorios puros, o euromilhoes tambem nao consegue, portanto, descobre o padrao xD, lol.
Desculpem se estou a dizer algo errado ;).

Cumps ;).
 
Muito obrigado, assim já não bloqueia :D.

Também já reparei que ele repete números. Existe alguma maneira diferente de impedir que se repitam, de uma maneira diferente da que fiz claro:D.

EDIT : Uso a mesma rotina de comparação em VB.NET e nunca repetiu um número.


Basta substituires no while, o && por ||, pk basta que um numero seja igual aos anteriores para entrar no ciclo while, pk no teu caso estavas a dizer que tinha de ser igual a todos os numeros atribuidos anterioremente, o que não é realidade! Imagina que já passaram 3 numeros e vais para o 4 e este é repetido, realmente ele verifica uma das condições, mas como tu disseste que tem de se verificar as outras 2 então vai dar bosta e vai continuar :)!
Espero que tenha ajudado e tenhas compreendido o que tinhas mal feito!
 
Se alguém se importar mais ou menos como fazer o que está no post acima agradecia. Já andei a procurar algumas coisas sobre isso e não encontro nada( ou não ando a procurar fundo o suficiente).
 
Back
Topo