Avatar billede henrikgn Nybegynder
07. januar 2005 - 19:55 Der er 6 kommentarer og
1 løsning

Tilfældige tal

Hej

Jeg har genereret 4 tilfældige tal mellem 1 og 6:

//4 tilfældige tal:
Random rndTal = new Random();
for(int j = 0; j < 4; j++ )
{
    strSolution[j] = rndTal.Next(1,6).ToString();
}

Hvordan kan jeg lave en algoritme, der sikrer at ingen af de 4 tilfældige tal mellem 1 og 6 er gengangere - dvs. hvert tal kun forekommer én gang?
Avatar billede arne_v Ekspert
07. januar 2005 - 19:57 #1
Så er de jo ikke tilfældige ...

:-)

Lav en ArrayList med 6 tal 1-6 og pick et tilfældigt tal fra den og slet når du har
taget den.
Avatar billede arne_v Ekspert
07. januar 2005 - 19:57 #2
using System;
using System.Collections;

public class TestPickClass
{
    private const int REP = 25000;
    private const int SEED = 13579;
    private static bool Duplicate(int[] a, int l)
    {
        for(int i = 0; i < l; i++)
        {
            if(a[i] == a[l])
            {
                return true;
            }
        }
        return false;
    }
    public static int[] Pick1(int m, int n)
    {
        int[] res = new int[m];
        Random rng = new Random(SEED);
        for(int j = 0; j < m; j++)
        {
            do
            {
                res[j] = rng.Next(1, n + 1);
            } while(Duplicate(res, j));
        }
        return res;
    }
    public static int[] Pick2(int m, int n)
    {
        int[] res = new int[m];
        ArrayList list = new ArrayList(n);
        for(int i = 1; i <= n; i++) list.Add(i);
        Random rng = new Random(SEED);
        for(int j = 0; j < m; j++)
        {
            int ix = rng.Next(list.Count);
            res[j] = (int)list[ix];
            list.RemoveAt(ix);
        }
        return res;
    }
    public static int[] Pick3(int m, int n)
    {
        int[] res = new int[m];
        bool[] used = new bool[n];
        for(int i = 1; i < n; i++) used[i] = false;
        Random rng = new Random(SEED);
        for(int j = 0; j < m; j++)
        {
            do
            {
                res[j] = rng.Next(1, n + 1);
            } while(used[res[j] - 1]);
            used[res[j] - 1] = true;
        }
        return res;
    }
    public static int[] Pick4(int m, int n)
    {
        int[] res = new int[m];
        bool[] used = new bool[n];
        for(int i = 1; i < n; i++) used[i] = false;
        Random rng = new Random(SEED);
        for(int j = 0; j < m; j++)
        {
            int ix = rng.Next(n - j);
            res[j] = 1;
            while(ix > 0)
            {
                res[j]++;
                if(!used[res[j] - 1]) ix--;
            }
            used[res[j] - 1] = true;
        }
        return res;
    }
    public static int[] Pick5(int m, int n)
    {
        int[] res = new int[m];
        bool[] used = new bool[n];
        for(int i = 1; i < n; i++) used[i] = false;
        int first = 1;
        int last = n;
        Random rng = new Random(SEED);
        for(int j = 0; j < m; j++)
        {
            do
            {
                res[j] = rng.Next(first, last + 1);
            } while(used[res[j] - 1]);
            used[res[j] - 1] = true;
            while(used[first - 1] && (first < last)) first++;
            while(used[last - 1] && (last > first)) last--;
        }
        return res;
    }
    public static void Main(string[] args)
    {
        int[] test1 = Pick1(10, 10);
        int[] test2 = Pick1(10, 10);
        int[] test3 = Pick1(10, 10);
        int[] test4 = Pick1(10, 10);
        int[] test5 = Pick1(10, 10);
        for(int i = 0; i < 10; i++)
        {
            Console.WriteLine(test1[i] + " " + test2[i] + " " + test3[i] + " " + test4[i] + " " + test5[i]);
        }
        for(int n = 20; n <= 200; n += 20)
        {
            for(int m = 5; m <= n; m += 5)
            {
                long t1 = DateTime.Now.Ticks;
                for(int i = 0; i < REP; i++)
                {
                    int[] res = Pick1(m, n);
                }
                long t2 = DateTime.Now.Ticks;
                long t3 = DateTime.Now.Ticks;
                for(int i = 0; i < REP; i++)
                {
                    int[] res = Pick2(m, n);
                }
                long t4 = DateTime.Now.Ticks;
                long t5 = DateTime.Now.Ticks;
                for(int i = 0; i < REP; i++)
                {
                    int[] res = Pick3(m, n);
                }
                long t6 = DateTime.Now.Ticks;
                long t7 = DateTime.Now.Ticks;
                for(int i = 0; i < REP; i++)
                {
                    int[] res = Pick4(m, n);
                }
                long t8 = DateTime.Now.Ticks;
                long t9 = DateTime.Now.Ticks;
                for(int i = 0; i < REP; i++)
                {
                    int[] res = Pick5(m, n);
                }
                long t10 = DateTime.Now.Ticks;
                Console.WriteLine(String.Format("{0,3:d} {1,3:d} {2,6:f} {3,6:f} {4,6:f} {5,6:f} {6,6:f}", m, n,
                                                (t2 - t1) / 10000000.0,
                                                (t4 - t3) / 10000000.0,
                                                (t6 - t5) / 10000000.0,
                                                (t8 - t7) / 10000000.0,
                                                (t10 - t9) / 10000000.0));
            }
        }
    }
}
Avatar billede arne_v Ekspert
07. januar 2005 - 19:58 #3
Svarende til Pick2(6, 6) i ovenstående kode
Avatar billede erikjacobsen Ekspert
07. januar 2005 - 21:03 #4
Lidt simplere hvis du skal have 4 ud af 6.
1) Lav array fra 1 til 6
2) Bland dem
3) Tag de 4 første

    int[] s = new int[6];
     
    for (int i=0;i<s.Length;i++) {
      s[i]=i+1;
    }

    Random rndTal = new Random();

    for (int i=0;i<s.Length;i++) {
      int j=rndTal.Next(0,5);
      int tmp=s[i];
      s[i]=s[j];
      s[j]=tmp;
    }

    for (int i=0;i<4;i++) {
      Console.WriteLine(s[i]);
    }
Avatar billede henrikgn Nybegynder
08. januar 2005 - 12:16 #5
Tak for jeres forslag... Havde lidt svært ved at gennemskue dem, og kom i tanke om følgende mulighed:

//4 tilfældige tal:
Random rndTal = new Random();
           
intSol1 = rndTal.Next(1,7);
intSol2 = rndTal.Next(1,7);
while (intSol1 == intSol2)
{
    intSol2 = rndTal.Next(1,7);
}
intSol3 = rndTal.Next(1,7);
while (intSol1 == intSol3 | intSol2 == intSol3)
{
    intSol3 = rndTal.Next(1,7);
}
intSol4 = rndTal.Next(1,7);
while (intSol1 == intSol4 | intSol2 == intSol4 | intSol3 == intSol4)
{
    intSol4 = rndTal.Next(1,7);
}

MessageBox.Show("Tal: " + intSol1 + intSol2 + intSol3 + intSol4);

Ved godt det måske er en idiotisk løsning... men den virker faktisk glimrende.

Smid svar hvis I vil ha points.
Avatar billede arne_v Ekspert
08. januar 2005 - 16:26 #6
Det er samme ide som Pick1 (bare med enkelt variable
fremfor array).
Avatar billede arne_v Ekspert
08. januar 2005 - 16:26 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester