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?
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.