Problem z losowaniem, często takie same losowanie.

0
 
            //losoujemy teraz trzy odpowiedzi.....................////////////////////// bez powtórzeń
            int[] wylosowaneLiczby = new int[slowaAng.Count];
            int ile = slowaAng.Count;
            for (int i = 0; i < ile; i++)
            {
                wylosowaneLiczby[i] = i;
            }
            
            Random losujOdpowiedzi = new Random();

            for (int i = ile - 1; i > ile - 4; --i)
            {
                int p = losujOdpowiedzi.Next(0, i);
                if (i != p)
                {
                    int t = wylosowaneLiczby[i]; wylosowaneLiczby[i] = wylosowaneLiczby[p]; wylosowaneLiczby[p] = t;
                }
            }
            listaLinkLabeli[Liczby[0]].Text=slowaAng[wylosowaneLiczby[0]];
            listaLinkLabeli[Liczby[1]].Text = slowaAng[wylosowaneLiczby[1]];
            listaLinkLabeli[Liczby[2]].Text = slowaAng[wylosowaneLiczby[2]];
            listaLinkLabeli[Liczby[3]].Text = slowaAng[zmiennaIndex];
            for (int i = 0; i < 3; i++)//sprawdzamy aby odpowiedź nie powtórzyła się dwa razy
            {
                if (listaLinkLabeli[Liczby[i]].Text == slowaAng[zmiennaIndex])
                    listaLinkLabeli[Liczby[i]].Text = null;
            }

        }

Zadaniem tego jest wylosować 3 liczby, z przedziału od 0 do rozmiaru listy, potem przypisujemy wylosowane liczby do tablicy. Włączam program, wiem że w liście mam 247 elementów. Losuje raz wyświetlają się elementy, losuje drugi raz i pojawiają się cały czas te same. Jak to poprawić?

0

obiekt Random powinien być utworzony raz (jako pole klasy).

0
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Media;
namespace Vocabulary

{
    public partial class Form1 : Form
    {
        Random losuj = new Random();
        int[] Liczby = new int[4];
        //metoda wyświetlająca słowa do wyboru w tapPage 
        private void wyswietlWyborPltoAng(List<string> slowaAng, int zmiennaIndex, List<LinkLabel> listaLinkLabeli)
        {
            //losujemy indexy labeli bez powtórzeń
            for (int i = 0; i < 4; ++i)
                Liczby[i] = i;
            for (int i = 3; i > 0; --i)
            {
                int p = losuj.Next(0, i);
                if (i != p)
                {
                    int t = Liczby[i]; Liczby[i] = Liczby[p]; Liczby[p] = t;
                }
            }
            //losoujemy teraz trzy odpowiedzi.....................////////////////////// bez powtórzeń
            int[] wylosowaneLiczby = new int[slowaAng.Count];
            int ile = slowaAng.Count;
            for (int i = 0; i < ile; i++)
            {
                wylosowaneLiczby[i] = i;
            }
            

            for (int i = ile - 1; i > ile - 4; --i)
            {
                int p = losuj.Next(0, ile);
                if (i != p)
                {
                    int t = wylosowaneLiczby[i]; wylosowaneLiczby[i] = wylosowaneLiczby[p]; wylosowaneLiczby[p] = t;
                }
            }
            listaLinkLabeli[Liczby[0]].Text=slowaAng[wylosowaneLiczby[0]];
            listaLinkLabeli[Liczby[1]].Text = slowaAng[wylosowaneLiczby[1]];
            listaLinkLabeli[Liczby[2]].Text = slowaAng[wylosowaneLiczby[2]];
            listaLinkLabeli[Liczby[3]].Text = slowaAng[zmiennaIndex];
            for (int i = 0; i < 3; i++)//sprawdzamy aby odpowiedź nie powtórzyła się dwa razy
            {
                if (listaLinkLabeli[Liczby[i]].Text == slowaAng[zmiennaIndex])
                    listaLinkLabeli[Liczby[i]].Text = null;
            }

        }
 

Dalej jest to samo.

0

Próbowałem jeszcze w ten sposób:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Media;
namespace Vocabulary

{
    public partial class Form1 : Form
    {
        TimeSpan time = new TimeSpan();
        int[] Liczby = new int[4];
        
        public List<string> listaPl = new List<string>(); //do przechowywania słówek polskich
        public List<string> listaAng = new List<string>(); //do przechowywania słówek angielskich
        public List<string> Bazy = new List<string>(); //do przechowywania posiadanych baz
        private List<LinkLabel> listaLinkLabeliPltoAng = new List<LinkLabel>();
        private List<LinkLabel> listaLinkLabeliWyborAngtoPl = new List<LinkLabel>();
        private List<LinkLabel> listaLinkLabeliRozumienieZeSluchu = new List<LinkLabel>();
        public int j;//zmienna odpowiedzialna, które słowo z listy wyświetlić
        private int tlIndex=0;//zmienna odpowiedzialna za tłumaczenie,dyktando słów
        public int zmiennaAudio = 0; //zmiena odpowiedzialna za to który dźwięk wyświetlić
        public string sciezka;
        string prawidlowaOdpowiedzWybor;
        
        private int randomNumber(int min, int max)
        {
            int czas;
            czas=time.Seconds;
            Random random = new Random(czas);
            return random.Next(min, max);
        }
 
        //metoda wyświetlająca słowa do wyboru w tapPage 
        private void wyswietlWyborPltoAng(List<string> slowaAng, int zmiennaIndex, List<LinkLabel> listaLinkLabeli)
        {
            //losujemy indexy labeli bez powtórzeń
            for (int i = 0; i < 4; ++i)
                Liczby[i] = i;
            for (int i = 3; i > 0; --i)
            {
                int p = randomNumber(0, i);
                if (i != p)
                {
                    int t = Liczby[i]; Liczby[i] = Liczby[p]; Liczby[p] = t;
                }
            }
            //losoujemy teraz trzy odpowiedzi.....................////////////////////// bez powtórzeń
            int ile = slowaAng.Count;
            int[] wylosowaneLiczby = new int[ile];
            for (int i = 0; i < ile; i++)
            {
                wylosowaneLiczby[i] = i;
            }
            

            for (int i = ile - 1; i > ile - 4; --i)
            {
                int p = randomNumber(0, ile);
                if (i != p)
                {
                    int t = wylosowaneLiczby[i]; wylosowaneLiczby[i] = wylosowaneLiczby[p]; wylosowaneLiczby[p] = t;
                }
            }
            listaLinkLabeli[Liczby[0]].Text=slowaAng[wylosowaneLiczby[0]];
            listaLinkLabeli[Liczby[1]].Text = slowaAng[wylosowaneLiczby[1]];
            listaLinkLabeli[Liczby[2]].Text = slowaAng[wylosowaneLiczby[2]];
            listaLinkLabeli[Liczby[3]].Text = slowaAng[zmiennaIndex];
            for (int i = 0; i < 3; i++)//sprawdzamy aby odpowiedź nie powtórzyła się dwa razy
            {
                if (listaLinkLabeli[Liczby[i]].Text == slowaAng[zmiennaIndex])
                    listaLinkLabeli[Liczby[i]].Text = null;
            }

        }
 

Ale dalej za każdym razem są losowane te same liczby. Chodzi o część, gdzie są losowane odpowiedzi, pierwsza część działa dobrze.

0
private int randomNumber(int min, int max)
        {
            int czas;
            czas=time.Seconds;
            Random random = new Random(czas);
            return random.Next(min, max);
        }

Twój błąd polega na tym, że inicjujesz random ZA KAŻDYM WYWOŁANIEM randomNumber. Linijka:
Random random = new Random(czas);
Powinna być wywoływana TYLKO RAZ.

0
 
    public partial class Form1 : Form
    {
        TimeSpan time = new TimeSpan();
        private Random losuj = new Random();
        int[] Liczby = new int[4];
        
        public List<string> listaPl = new List<string>(); //do przechowywania słówek polskich
        public List<string> listaAng = new List<string>(); //do przechowywania słówek angielskich
        public List<string> Bazy = new List<string>(); //do przechowywania posiadanych baz
        private List<LinkLabel> listaLinkLabeliPltoAng = new List<LinkLabel>();
        private List<LinkLabel> listaLinkLabeliWyborAngtoPl = new List<LinkLabel>();
        private List<LinkLabel> listaLinkLabeliRozumienieZeSluchu = new List<LinkLabel>();
        public int j;//zmienna odpowiedzialna, które słowo z listy wyświetlić
        private int tlIndex=0;//zmienna odpowiedzialna za tłumaczenie,dyktando słów
        public int zmiennaAudio = 0; //zmiena odpowiedzialna za to który dźwięk wyświetlić
        public string sciezka;
        string prawidlowaOdpowiedzWybor;

Czyli jeśli umieszcza Random losuj tak jak powyżej, będzie dobrze, zostanie stworzony raz? Tylko jak i gdzie go teraz zaincjalizować czasem?

0

A nie możesz tak?

public partial class Form1 : Form
    {
        TimeSpan time = new TimeSpan();
        private Random losuj = new Random(time.Seconds);
        int[] Liczby = new int[4];
0

No właśnie chyba nie.

Error 1 A field initializer cannot reference the non-static field, method, or property 'Vocabulary.Form1.time'

0

W takim razie zostaw pole klasy bez inicjalizacji, a samą inicjalizację przenieś do Initialize (nie widzę takiej metody w twym kodzie, ale za pewne jest? Widzę forma, to i InitializeComponents musi być gdzieś wywoływane...)

0
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Media;
namespace Vocabulary

{
    public partial class Form1 : Form
    {
        TimeSpan time = new TimeSpan();
        static private Random losuj;
        int[] Liczby = new int[4];
        
        public List<string> listaPl = new List<string>(); //do przechowywania słówek polskich
        public List<string> listaAng = new List<string>(); //do przechowywania słówek angielskich
        public List<string> Bazy = new List<string>(); //do przechowywania posiadanych baz
        private List<LinkLabel> listaLinkLabeliPltoAng = new List<LinkLabel>();
        private List<LinkLabel> listaLinkLabeliWyborAngtoPl = new List<LinkLabel>();
        private List<LinkLabel> listaLinkLabeliRozumienieZeSluchu = new List<LinkLabel>();
        public int j;//zmienna odpowiedzialna, które słowo z listy wyświetlić
        private int tlIndex=0;//zmienna odpowiedzialna za tłumaczenie,dyktando słów
        public int zmiennaAudio = 0; //zmiena odpowiedzialna za to który dźwięk wyświetlić
        public string sciezka;
        string prawidlowaOdpowiedzWybor; 
 
//incjalizacja*************incjalizacja********incjalizacja*************************************************************************
        public Form1()
        {
            InitializeComponent();
            this.MaximizeBox = false;
            losuj = new Random(time.Seconds);
            wczytajDostępneBazy(comboBox1); //ładujemy bazy do ComboBox1

Zrobiłem tak, ale dalej losuje te same odpowiedzi[indeksy]. Pokaże na screenach.
http://imageshack.us/photo/my-images/833/57070474.jpg/
http://imageshack.us/photo/my-images/109/73010733.jpg/
http://imageshack.us/photo/my-images/263/78963161.jpg/

        //metoda wyświetlająca słowa do wyboru w tapPage 
        private void wyswietlWyborPltoAng(List<string> slowaAng, int zmiennaIndex, List<LinkLabel> listaLinkLabeli)
        {
            //losujemy indexy labeli bez powtórzeń
            for (int i = 0; i < 4; ++i)
                Liczby[i] = i;
            for (int i = 3; i > 0; --i)
            {
                int p = losuj.Next(0, i);
                if (i != p)
                {
                    int t = Liczby[i]; Liczby[i] = Liczby[p]; Liczby[p] = t;
                }
            }
            wyswietlWyborOdpowiedzi(slowaAng, zmiennaIndex, listaLinkLabeli);
           
        }
        private void wyswietlWyborOdpowiedzi(List<string> slowaAng, int zmiennaIndex, List<LinkLabel> listaLinkLabeli)
        {
            //losoujemy teraz trzy odpowiedzi.....................////////////////////// bez powtórzeń
            int ile = slowaAng.Count;
            int[] wylosowaneLiczby = new int[ile];
            for (int i = 0; i < ile; i++)
            {
                wylosowaneLiczby[i] = i;
            }
            

            for (int i = ile - 1; i > ile - 4; --i)
            {
                int p = losuj.Next(0, ile);
                if (i != p)
                {
                    int t = wylosowaneLiczby[i]; wylosowaneLiczby[i] = wylosowaneLiczby[p]; wylosowaneLiczby[p] = t;
                }
            }
            listaLinkLabeli[Liczby[0]].Text=slowaAng[wylosowaneLiczby[0]];
            listaLinkLabeli[Liczby[1]].Text = slowaAng[wylosowaneLiczby[1]];
            listaLinkLabeli[Liczby[2]].Text = slowaAng[wylosowaneLiczby[2]];
            listaLinkLabeli[Liczby[3]].Text = slowaAng[zmiennaIndex];
            for (int i = 0; i < 3; i++)//sprawdzamy aby odpowiedź nie powtórzyła się dwa razy
            {
                if (listaLinkLabeli[Liczby[i]].Text == slowaAng[zmiennaIndex])
                    listaLinkLabeli[Liczby[i]].Text = null;
            }

        }
 

Na czym wciąż polega błąd?

0

Bo inicjalizujesz new Random(time.Seconds) czyli w Twoim przypadku new Random(0). To samo ziarno, te same wyniki generowania liczb losowych :) Użyj po prostu new Random().

0

pan Kuba zrobiłem tak jak mówisz, ale dalej ciągle to samo.

0

a próbowałeś WYŚWIETLAĆ losowane LICZBY, czy tylko patrzysz że dostajesz te same wynikowe teksty?

            for (int i = ile - 1; i > ile - 4; --i)
            {
                int p = losuj.Next(0, ile);
                if (i != p)
                {
                    int t = wylosowaneLiczby[i]; wylosowaneLiczby[i] = wylosowaneLiczby[p]; wylosowaneLiczby[p] = t;
                }
            }

ta pętla jest coś strasznie pokręcona. co to ma robić?

0

Masz rację, że jest dziwna, dlatego rozwiązałem mój problem w ten sposób.

{
    public partial class Form1 : Form
    {
        static private Random losuj;
        int[] Liczby = new int[4];
        int[] indexyOdpowiedzi = new int[4];
 
        private void wylosujWyborOdpowiedziTest(List<string> slowa, int zmiennaIndex, List<LinkLabel> listaLinkLabeli)
        {
            int maxPrzedzial = slowa.Count;
            for (int i = 0; i < 4; i++)
            {
                int wylosowana = losuj.Next(0, maxPrzedzial);
                if (indexyOdpowiedzi[i] != wylosowana)
                    indexyOdpowiedzi[i] = wylosowana;
            }
            listaLinkLabeli[Liczby[0]].Text = slowa[indexyOdpowiedzi[0]];
            listaLinkLabeli[Liczby[1]].Text = slowa[indexyOdpowiedzi[1]];
            listaLinkLabeli[Liczby[2]].Text = slowa[indexyOdpowiedzi[2]];
            listaLinkLabeli[Liczby[3]].Text = slowa[zmiennaIndex];
            for (int i = 0; i < 3; i++)//sprawdzamy aby odpowiedź nie powtórzyła się dwa razy
            {
                if (listaLinkLabeli[Liczby[i]].Text == slowa[zmiennaIndex])
                    listaLinkLabeli[Liczby[i]].Text = null;
            }
        }
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1