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?
Annonceindlæg fra Netic
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)); } } } }
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]); }
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.