IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C# - Náhodné seřazení elementů v array

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Pavel Odehnal:3.9.2017 23:50

Ahoj. Jako začátečník jsem dostal za úkol naprogramovat jednoduchou hru ve WPF.
Vše se podařilo. Až na poslední krok. Seřazení prvků při startu programu má být náhodné.
Zjišťuju, že příkaz "SHUFFLE" je naprostým nesmyslem.

Budu rád za jakoukoliv radu nebo nakopnutí. Sám nejsem schopnej nic vymyslet. :(( Děkuju předem. Pavel.

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)


        {
            int gedrückterKnopf = 0;
            Button[] knöpfe = {button01, button02, button03, button04, button05, button06, button07, button08, button09, button10, button11, button12, button13, button14, button15, button16 };
           Shuffle(knöpfe);     //    <------------------------------ TADY JE CHYBA :((

            for (int i = 0; i < 16; i++)
            {
                if (knöpfe[i] == sender)
                {
                    gedrückterKnopf = i;
                    break;
                }
            }

            int leerstelle = 0;
            for (int i = 0; i<16; i++)
            {
                if (!knöpfe[i].IsEnabled)
                {
                    leerstelle = i;
                }

            }
            //MessageBox.Show(gedrückterKnopf.ToString() + " " + leerstelle.ToString());

            int zeile1 = Grid.GetRow(knöpfe[gedrückterKnopf]);
            int spalte1 = Grid.GetColumn(knöpfe[gedrückterKnopf]);
            int zeile2 = Grid.GetRow(knöpfe[leerstelle]);
            int spalte2 = Grid.GetColumn(knöpfe[leerstelle]);

            if ( (zeile1 == zeile2 - 1 || zeile1 == zeile2 + 1) && spalte1 == spalte2
                ||
                (spalte1 == spalte2 - 1 || spalte1 == spalte2 + 1) && zeile1 == zeile2
                )
            {
                //MessageBox.Show("Huhu!")
                Grid.SetRow(knöpfe[gedrückterKnopf], zeile2);
                Grid.SetColumn(knöpfe[gedrückterKnopf], spalte2);
                Grid.SetRow(knöpfe[leerstelle], zeile1);
                Grid.SetColumn(knöpfe[leerstelle], spalte1);
            }
        }
    }
}
 
Odpovědět
3.9.2017 23:50
Avatar
Mimi Moore
Člen
Avatar
Mimi Moore:4.9.2017 7:14
using System.Linq;

Jednoduchá verzia:

Random r = new Random();
knöpfe = knöpfe.OrderBy(x => r.Next()).ToArray();

Generická funkcia na pole ľubovoľného typu:

static T[] Shuffle<T>(T[] array)
      {
          Random r = new Random();
          return array.OrderBy(x => r.Next()).ToArray();
      }

Ak by čísla neboli dosť náhodné, dá sa na generovanie použiť RNGCryptoServi­ceProvider class z namespace System.Securi­ty.Cryptograp­hy, ale pre tvoje účely by to malo stačiť.

Ešte rada - je dobrým zvykom používať diakritiku maximálne v komentároch (najlepšie ani tam nie) :)

 
Nahoru Odpovědět
4.9.2017 7:14
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Mimi Moore
Jan Vargovský:4.9.2017 9:52

Na tohle fakt nepotřebuje RNG crypto generator ..

Pavel Odehnal mrkni na Fisher-Yates shuffle algoritmus.

 
Nahoru Odpovědět
4.9.2017 9:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.