Avatar billede geiri Nybegynder
21. december 2004 - 22:23 Der er 13 kommentarer og
1 løsning

fjern duplicate

Hi
jeg har array som kører random tal fra 1 - 45, og skriver 7 random tal ned, hvordan kan jeg forhindre at samme tal
kommer op.
Avatar billede kalp Novice
21. december 2004 - 22:26 #1
du kan lave en løkke som tjekker de tal i din array med det nye tal og i en if sætning bestemme om den skal gemmes eller ikke gemmes
Avatar billede kalp Novice
21. december 2004 - 22:37 #2
det måske lettere at sætte 7 tal ind først... og bagefter tjekke om der er dups... hvis der er så kører du et random på de steder  i dit array hvor de dups optræder
Avatar billede plx Nybegynder
21. december 2004 - 22:49 #3
kalp's forslag omsat til kode:

  int[] rtal = new int[7];
  int i, n;

  Random rnd = new Random();

  for(i=0; i<7; )
  {
    int x = rnd.Next(1, 45);

    // findes tallet?
    for(n=0; n<7; n++)
    {
      if(rtal[n] == x) break;
    }

    if(n == 7)
    {
      // findes ikke i forvejen
      rtal[i++] = x;
    }
  }

  for(i=0; i<7; i++)
  {
    System.Console.WriteLine(rtal[i]);
  }
Avatar billede plx Nybegynder
21. december 2004 - 23:00 #4
Hvis du lader dig inspirere af ovenstående kode, så er der selvfølgelig ingen grund til at løbe den del af arrayet igennem, som endnu ikke er udfyldt..

  for(i=0; i<7; )
  {
    int x = rnd.Next(1, 45);

    // findes tallet?
    for(n=0; n<i; n++)
    {
      if(rtal[n] == x) break;
    }

    if(n == i)
    {
      // findes ikke i forvejen
      rtal[i++] = x;
    }
  }
Avatar billede kalp Novice
21. december 2004 - 23:50 #5
hmm.. bør vel ikke være en slyngel og ikke komme med kode selv hehe så her er mit bud... har ikke rigtig testet det men tror det virker! godt nok er min random anderledes.. taget fra java men satser på den kan bruges sådan i c# ...
men det er mere ideen i min kode..

Ikke testet hehe


int[] list = new int[7];
 
int tmp;
boolean ens;
for (int i = 0 ;i < list.length ;i++ )
{
 
tmp = (int) (Math.random() * 45 + 1);
ens = false;
while(!ens)
{
  for (int b = 0 ;b < list.length ;b++ )
  {
    if(tmp == list[b])
    {
    tmp = (int) (Math.random() * 45 + 1);
    ens = false;
    }
    else ens = true;
  }
 
}
list[i] = tmp;
}

    for (int i = 0 ;i < list.length ;i++ )
    {
    System.Console.WriteLine(list[i]);
    }
Avatar billede arne_v Ekspert
22. december 2004 - 00:02 #6
Anden måde at gøre det på:

using System;
using System.Collections;

class MainClass
{
    public static void Main(string[] args)
    {
        Random rng = new Random();
        ArrayList list = new ArrayList();
        for(int i = 1; i < 45; i++) list.Add(i);
        for(int j = 0; j < 7; j++)
        {
            int ix = rng.Next(list.Count);
            int n = (int)list[ix];
            list.RemoveAt(ix);
            Console.WriteLine(n);
        }
    }
}
Avatar billede ranglen Nybegynder
22. december 2004 - 00:54 #7
Jeg har lige kørt en lille benchmark, plx vinder

:)
Avatar billede geiri Nybegynder
22. december 2004 - 09:37 #8
Tak for hjælpen alle
Avatar billede geiri Nybegynder
22. december 2004 - 09:41 #9
p.s hvordan giver jeg min points?
Avatar billede arne_v Ekspert
22. december 2004 - 10:05 #10
Du tog dem selv.

Du bliver nødt til at oprette et nyt spørgsmål for at kunne give point.

Husk reference til dette spørgsmål.
Avatar billede arne_v Ekspert
24. december 2004 - 00:38 #11
ranglen>

Check de tidligere udtagne er hurtigst med 7 ud af 45.

Men metoden har nogle ret grimme egenskaber for m ud af n når m/n nærmer sig 1
og n bliver stor.

Der er dog et pænt overhead ved at remove fra en ArrayList.
Avatar billede arne_v Ekspert
24. december 2004 - 00:38 #12
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]);
        }
        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
24. december 2004 - 00:41 #13
8 8 8 8
2 2 2 2
4 4 4 4
9 9 9 9
10 10 10 10
3 3 3 3
1 1 1 1
6 6 6 6
7 7 7 7
5 5 5 5
  5  20  0,27  0,30  0,27  0,27  0,27
10  20  0,28  0,33  0,28  0,30  0,28
15  20  0,31  0,36  0,30  0,30  0,30
20  20  0,42  0,41  0,38  0,31  0,33
  5  40  0,25  0,33  0,27  0,28  0,27
10  40  0,28  0,38  0,28  0,31  0,28
15  40  0,30  0,38  0,30  0,38  0,30
20  40  0,31  0,42  0,30  0,38  0,31
25  40  0,36  0,44  0,36  0,41  0,33
30  40  0,44  0,47  0,42  0,42  0,38
35  40  0,50  0,50  0,42  0,44  0,42
40  40  0,63  0,53  0,45  0,50  0,44
  5  60  0,27  0,33  0,27  0,30  0,27
10  60  0,28  0,38  0,28  0,33  0,31
15  60  0,28  0,41  0,28  0,38  0,28
20  60  0,34  0,44  0,30  0,41  0,31
25  60  0,34  0,48  0,31  0,45  0,36
30  60  0,38  0,50  0,33  0,48  0,39
35  60  0,42  0,53  0,36  0,52  0,38
40  60  0,48  0,61  0,39  0,55  0,41
45  60  0,53  0,63  0,41  0,59  0,44
50  60  0,61  0,66  0,44  0,63  0,47
55  60  0,77  0,66  0,48  0,66  0,52
60  60  1,22  0,69  0,72  0,67  0,58
  5  80  0,27  0,36  0,27  0,30  0,27
10  80  0,28  0,42  0,28  0,34  0,28
15  80  0,30  0,42  0,33  0,39  0,30
20  80  0,31  0,45  0,30  0,45  0,30
25  80  0,34  0,53  0,31  0,50  0,31
30  80  0,36  0,58  0,31  0,55  0,33
35  80  0,39  0,55  0,34  0,59  0,36
40  80  0,42  0,61  0,34  0,67  0,36
45  80  0,47  0,63  0,39  0,69  0,39
50  80  0,53  0,66  0,39  0,77  0,41
55  80  0,59  0,72  0,42  0,78  0,47
60  80  0,66  0,72  0,45  0,88  0,45
65  80  0,73  0,77  0,50  0,91  0,52
70  80  0,98  0,80  0,55  0,94  0,56
75  80  1,20  0,83  0,69  0,95  0,66
80  80  2,11  0,86  0,98  0,98  0,75
  5 100  0,27  0,38  0,30  0,31  0,27
10 100  0,28  0,41  0,28  0,41  0,28
15 100  0,28  0,45  0,28  0,42  0,30
20 100  0,30  0,48  0,30  0,52  0,30
25 100  0,33  0,52  0,31  0,59  0,31
30 100  0,34  0,55  0,33  0,59  0,31
35 100  0,39  0,61  0,34  0,64  0,33
40 100  0,45  0,63  0,36  0,69  0,36
45 100  0,45  0,69  0,36  0,78  0,38
50 100  0,48  0,73  0,39  0,81  0,41
55 100  0,55  0,77  0,39  0,89  0,41
60 100  0,64  0,75  0,42  0,95  0,45
65 100  0,67  0,80  0,42  1,09  0,45
70 100  0,70  0,81  0,47  1,13  0,48
75 100  0,81  0,86  0,48  1,13  0,53
80 100  0,94  0,89  0,56  1,22  0,56
85 100  1,03  0,94  0,56  1,30  0,61
90 100  1,22  0,95  0,66  1,31  0,73
95 100  1,39  0,97  0,72  1,34  0,86
100 100  4,28  1,03  1,56  1,42  0,95
  5 120  0,25  0,41  0,27  0,38  0,27
10 120  0,28  0,44  0,27  0,41  0,28
15 120  0,30  0,47  0,31  0,45  0,30
20 120  0,31  0,50  0,30  0,56  0,30
25 120  0,33  0,53  0,31  0,59  0,31
30 120  0,36  0,61  0,31  0,64  0,33
35 120  0,42  0,61  0,33  0,70  0,34
40 120  0,41  0,69  0,34  0,77  0,34
45 120  0,45  0,72  0,38  0,83  0,36
50 120  0,48  0,77  0,38  0,89  0,39
55 120  0,55  0,75  0,39  0,97  0,39
60 120  0,58  0,81  0,41  1,08  0,41
65 120  0,61  0,83  0,41  1,19  0,42
70 120  0,66  0,86  0,47  1,22  0,44
75 120  0,70  0,94  0,45  1,28  0,47
80 120  0,75  0,92  0,47  1,41  0,48
85 120  0,81  1,00  0,48  1,42  0,53
90 120  0,95  1,00  0,53  1,53  0,53
95 120  1,09  1,02  0,59  1,59  0,55
100 120  1,30  1,05  0,61  1,69  0,64
105 120  1,44  1,09  0,64  1,77  0,67
110 120  1,61  1,09  0,75  1,78  0,75
115 120  2,30  1,19  0,88  1,91  0,88
120 120  4,81  1,16  1,58  1,91  1,00
  5 140  0,27  0,42  0,31  0,33  0,27
10 140  0,28  0,45  0,28  0,41  0,28
15 140  0,30  0,48  0,31  0,48  0,30
20 140  0,30  0,53  0,30  0,59  0,30
25 140  0,33  0,56  0,31  0,64  0,31
30 140  0,34  0,64  0,31  0,69  0,33
35 140  0,41  0,64  0,34  0,75  0,33
40 140  0,41  0,70  0,36  0,83  0,36
45 140  0,42  0,77  0,36  0,89  0,38
50 140  0,45  0,80  0,36  0,98  0,38
55 140  0,53  0,80  0,39  1,05  0,39
60 140  0,55  0,84  0,41  1,17  0,42
65 140  0,58  0,88  0,41  1,31  0,42
70 140  0,64  0,94  0,42  1,34  0,44
75 140  0,73  0,94  0,44  1,42  0,47
80 140  0,77  0,97  0,50  1,53  0,52
85 140  0,84  1,02  0,48  1,66  0,48
90 140  0,98  1,02  0,53  1,75  0,53
95 140  1,02  1,11  0,53  1,80  0,59
100 140  1,08  1,14  0,55  1,89  0,63
105 140  1,28  1,17  0,61  1,97  0,66
110 140  1,41  1,20  0,64  2,08  0,69
115 140  1,63  1,20  0,67  2,19  0,70
120 140  1,77  1,22  0,75  2,25  0,80
125 140  2,02  1,27  0,78  2,31  0,89
130 140  2,53  1,30  0,89  2,39  0,98
135 140  2,84  1,34  0,97  2,42  1,05
140 140  5,33  1,38  1,61  2,41  1,20
  5 160  0,27  0,44  0,27  0,34  0,28
10 160  0,31  0,48  0,28  0,42  0,28
15 160  0,30  0,50  0,30  0,52  0,31
20 160  0,31  0,55  0,31  0,59  0,34
25 160  0,33  0,58  0,31  0,69  0,31
30 160  0,36  0,66  0,33  0,73  0,33
35 160  0,38  0,70  0,33  0,81  0,34
40 160  0,41  0,72  0,38  0,88  0,36
45 160  0,42  0,80  0,36  0,97  0,36
50 160  0,47  0,83  0,38  1,05  0,38
55 160  0,53  0,83  0,39  1,13  0,41
60 160  0,53  0,88  0,42  1,25  0,41
65 160  0,63  0,89  0,41  1,41  0,42
70 160  0,66  0,94  0,42  1,52  0,44
75 160  0,69  0,97  0,48  1,52  0,50
80 160  0,73  1,00  0,45  1,75  0,48
85 160  0,78  1,06  0,48  1,78  0,52
90 160  0,89  1,08  0,48  2,00  0,52
95 160  0,95  1,13  0,53  2,06  0,56
100 160  1,03  1,17  0,56  2,19  0,58
105 160  1,17  1,20  0,58  2,27  0,61
110 160  1,33  1,22  0,61  2,39  0,64
115 160  1,45  1,23  0,67  2,48  0,69
120 160  1,59  1,30  0,67  2,59  0,69
125 160  1,80  1,31  0,75  2,69  0,72
130 160  1,91  1,38  0,78  2,73  0,78
135 160  2,20  1,34  0,80  2,86  0,84
140 160  2,41  1,42  0,86  2,92  0,92
145 160  2,73  1,42  0,97  3,02  1,00
150 160  3,05  1,48  0,98  3,13  1,19
155 160  3,61  1,55  1,13  3,22  1,33
160 160  5,84  1,55  1,58  3,22  1,45
  5 180  0,25  0,45  0,27  0,41  0,28
10 180  0,27  0,50  0,28  0,44  0,28
15 180  0,30  0,55  0,28  0,56  0,30
20 180  0,30  0,58  0,30  0,67  0,31
25 180  0,31  0,61  0,31  0,72  0,33
30 180  0,36  0,66  0,31  0,84  0,31
35 180  0,38  0,69  0,33  0,88  0,34
40 180  0,41  0,75  0,33  0,98  0,34
45 180  0,42  0,80  0,34  1,05  0,38
50 180  0,45  0,83  0,36  1,17  0,38
55 180  0,48  0,86  0,39  1,25  0,39
60 180  0,52  0,92  0,39  1,34  0,41
65 180  0,58  0,94  0,39  1,53  0,42
70 180  0,61  0,98  0,44  1,61  0,47
75 180  0,66  1,05  0,42  1,70  0,44
80 180  0,70  1,06  0,47  1,89  0,45
85 180  0,75  1,09  0,45  1,97  0,48
90 180  0,86  1,09  0,47  2,14  0,48
95 180  0,94  1,16  0,50  2,22  0,50
100 180  1,00  1,19  0,50  2,36  0,56
105 180  1,08  1,23  0,55  2,50  0,55
110 180  1,19  1,25  0,59  2,59  0,58
115 180  1,28  1,33  0,58  2,75  0,61
120 180  1,39  1,39  0,73  2,89  0,67
125 180  1,63  1,47  0,61  3,20  0,69
130 180  1,56  1,56  0,64  3,06  0,69
135 180  1,70  1,47  0,67  3,14  0,77
140 180  1,78  1,50  0,69  3,23  0,77
145 180  1,92  1,55  0,70  3,42  0,84
150 180  2,14  1,56  0,75  3,50  0,91
155 180  2,63  1,53  0,89  3,58  1,06
160 180  2,95  1,59  0,95  3,66  1,13
165 180  3,33  1,61  1,00  3,77  1,23
170 180  4,17  1,67  1,14  3,88  1,31
175 180  5,70  1,69  1,44  4,00  1,41
180 180  9,03  1,73  2,09  4,33  1,70
  5 200  0,25  0,48  0,27  0,38  0,28
10 200  0,27  0,53  0,31  0,45  0,28
15 200  0,30  0,56  0,28  0,61  0,28
20 200  0,31  0,59  0,31  0,66  0,31
25 200  0,33  0,67  0,31  0,77  0,31
30 200  0,38  0,69  0,33  0,83  0,33
35 200  0,36  0,72  0,34  0,91  0,34
40 200  0,39  0,78  0,34  1,00  0,34
45 200  0,42  0,81  0,36  1,09  0,36
50 200  0,45  0,84  0,38  1,19  0,38
55 200  0,48  0,89  0,39  1,28  0,39
60 200  0,52  0,94  0,39  1,41  0,41
65 200  0,56  0,97  0,41  1,56  0,42
70 200  0,61  1,02  0,42  1,67  0,44
75 200  0,66  1,03  0,42  1,75  0,44
80 200  0,70  1,09  0,45  1,95  0,47
85 200  0,75  1,13  0,45  2,05  0,48
90 200  0,81  1,16  0,47  2,23  0,48
95 200  0,89  1,20  0,50  2,33  0,52
100 200  0,97  1,22  0,52  2,47  0,53
105 200  1,06  1,25  0,55  2,58  0,56
110 200  1,16  1,30  0,56  2,75  0,58
115 200  1,27  1,38  0,58  2,91  0,61
120 200  1,34  1,34  0,61  3,03  0,61
125 200  1,44  1,39  0,63  3,16  0,63
130 200  1,53  1,44  0,66  3,28  0,67
135 200  1,66  1,48  0,67  3,39  0,70
140 200  1,75  1,50  0,69  3,50  0,70
145 200  1,83  1,52  0,72  3,64  0,73
150 200  2,08  1,58  0,77  3,78  0,78
155 200  2,27  1,63  0,80  3,89  0,86
160 200  2,44  1,63  0,83  3,98  0,92
165 200  2,80  1,66  0,91  4,13  0,97
170 200  2,94  1,67  0,92  4,27  1,02
175 200  3,30  1,75  0,98  4,41  1,09
180 200  3,78  1,77  1,08  4,50  1,17
185 200  4,34  1,80  1,17  4,61  1,25
190 200  5,22  1,81  1,33  4,73  1,34
195 200  6,41  1,88  1,55  4,75  1,50
200 200  8,61  1,86  1,95  4,78  1,75
Avatar billede kalp Novice
24. december 2004 - 00:49 #14
Det et simpelt spørgsmål og alligevel ikke: )

God jul;)
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