Problem z losowaniem tych samych pytań

0

Witam piszę program w VS w którym chciałem losować pytania coś ala milionerzy. Udało już mi się zrobić pytania wczytywanie odpowiedzi i nawet żeby się losowały lecz pojawiają się te same. Widziałem podobne typu posty lecz rozwiązania tyczyły się głównie C++ albo pisania w command line. Siedzę nad tym już dobre kilka godzin i wcale mi nie idzie. Mogę liczyć na podpowiedzi? :)

int nr; //Deklaracja zmiennej globalnej nr pytania
char odp; //Zmienna przechwytująca prawidłową odpowiedź
int czas = 30;
int ilosc_pytan = 9; // ilość pytań

Random losowa = new Random(); // LOSOWANIE PYTANIA 
int nr = losowa.Next(0, ilosc_pytan);

Doszedłem jedynie to tego random który tutaj mam nie wiem jak dalej skonstruować całą tą formułkę z for itd z żadnego poradnika który czytałem/oglądałem nie wiem co do czego bądź jest w innym języku.

2
  1. Utworzenie Randoma musisz mieć przed pętlą, a w pętli tylko pobieranie za pomocą .Next
  2. W pętli powinieneś równiez w jakiś magiczny sposób sprawdzać, czy dany numer jjuż nie wystąpił.
  3. Utwórz Randoma z wartością startową, np. zależną od czasu - wtedy b ędziesz mieć pewność, że będzie randomowa za każdym razem. Tu masz przykłady:
    https://stackoverflow.com/questions/1785744/how-do-i-seed-a-random-class-to-avoid-getting-duplicate-random-values
1

Zależy ile tych zestawów pytań będzie, bo można też zamieszać całą tablicą i odczytać
n zestawów z początku.
Przykłady mieszania listą:
https://www.dotnetperls.com/fisher-yates-shuffle
https://stackoverflow.com/questions/108819/best-way-to-randomize-an-array-with-net

0
Marcin.Miga napisał(a):
  1. Utworzenie Randoma musisz mieć przed pętlą, a w pętli tylko pobieranie za pomocą .Next

Czyli mam zacząć jakoś tak?

Random losuj = new Random();
for (nr=0; nr<ilosc_pytan; nr++)
{
   int nr = losowa.Next(0, ilosc_pytan);
}
  1. W pętli powinieneś równiez w jakiś magiczny sposób sprawdzać, czy dany numer jjuż nie wystąpił.

No właśnie i jak to sprawdzić?

  1. Utwórz Randoma z wartością startową, np. zależną od czasu - wtedy b ędziesz mieć pewność, że będzie randomowa za każdym razem.

Z tym też bym miał problem :l

1
eveyron napisał(a):
Marcin.Miga napisał(a):
  1. Utworzenie Randoma musisz mieć przed pętlą, a w pętli tylko pobieranie za pomocą .Next

Czyli mam zacząć jakoś tak?

Random losuj = new Random();
for (nr=0; nr<ilosc_pytan; nr++)
{
   int nr = losowa.Next(0, ilosc_pytan);
}

Tak

  1. W pętli powinieneś równiez w jakiś magiczny sposób sprawdzać, czy dany numer jjuż nie wystąpił.

No właśnie i jak to sprawdzić?

Tak jak umiesz... :) Sposobów jest kilka.

  1. Utwórz Randoma z wartością startową, np. zależną od czasu - wtedy b ędziesz mieć pewność, że będzie randomowa za każdym razem.

Z tym też bym miał problem :l

W podanym linku było pokazane... Generalnie Random losuj = new Random(jakasZmiennaLiczba);

0

Okej, jak tylko wrócę z pracy to usiądę do tego i coś spróbuje coś napisać. Dzięki za pomoc!

0

A jeszcze takie pytanie bo coś mi się nie udaje.
Czy żeby dojść do tego losowania bez powtórzeń mam dodać jakieś kolejne zmienne czy wystarczy tyle co mam?

int nr; //Deklaracja zmiennej globalnej nr pytania
char odp; //Zmienna przechwytująca prawidłową odpowiedź
int czas = 30;
int ilosc_pytan = 9; // ilość pytań
1

Żeby było bez powtórzeń, musisz gdzieś zapamiętać, które pytania już były wylosowane.
Najwygodniej będzie ci załadować zestawy pytań do listy i wymieszać.

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
   public class Question
   {
      public Question(string p1, string p2, string p3, string p4, string a)
      {
         prompt1 = p1;
         prompt2 = p2;
         prompt3 = p3;
         prompt4 = p4;
         answer = a;
      }

      public override string ToString()
      {
         return "a) " + prompt1 + "\nb) " + prompt2 + "\nc) " + prompt3 + "\nd) " + prompt4 + "\n" + answer + "\n";
      }

      private string prompt1;
      private string prompt2;
      private string prompt3;
      private string prompt4;
      private string answer;
   }

    class Program
    {
      static void Main(string[] args)
      {
         List<Question> l = new List<Question>();
         l.Add(new Question("q1prompt1", "q1prompt2", "q1prompt3", "q1prompt4", "q1answer"));
         l.Add(new Question("q2prompt1", "q2prompt2", "q2prompt3", "q2prompt4", "q2answer"));
         l.Add(new Question("q3prompt1", "q3prompt2", "q3prompt3", "q3prompt4", "q3answer"));
         l.Add(new Question("q4prompt1", "q4prompt2", "q4prompt3", "q4prompt4", "q4answer"));
         l.Add(new Question("q5prompt1", "q5prompt2", "q5prompt3", "q5prompt4", "q5answer"));
         l.Add(new Question("q6prompt1", "q6prompt2", "q6prompt3", "q6prompt4", "q6answer"));


         PrintList(l);
         Console.WriteLine();
         Shuffle(l);
         PrintList(l);
         Console.WriteLine();
      }

      private static Random rng = new Random();

      public static void Shuffle<T>(IList<T> list)
      {
         int n = list.Count;
         while (n > 1)
         {
            n--;
            int k = rng.Next(n + 1);
            T value = list[k];
            list[k] = list[n];
            list[n] = value;
         }
      }

      public static void PrintList<T>(IList<T> list)
      {
         foreach(T el in list)
         {
            Console.WriteLine(el.ToString());
         }
      }
   }
}

https://ideone.com/B8n5Im

... i teraz piszesz jakąś logikę zadawania pytań.
Zadajesz kolejno pytania z wymieszanej listy póki user odpowiada prawidłowo.

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