char chRet = '\0'; Random rand = new Random(); int randNum = rand.Next(100); if (randNum < 10) { chRet = 'A'; } else if (randNum < 10 + 10) { chRet = 'B'; } else if (randNum < 10 + 10 + 35) { chRet = 'C'; } else if (randNum < 10 + 10 + 35 + 25) { chRet = 'D'; } else { chRet = 'E'; }
Random r=new Random(); if (r.Next(0,10) < 10) return A; 随机数控制概率参考
OO一点 class CandidatePair { public char Value { get;set; } public int Min {get;set;} public int Max {get;set;} } static void Test() { var candidateList = new List<CandidatePair>() { new CandidatePair(){Value='A', Min=0,Max=9}, new CandidatePair(){Value='B',Min=10,Max=19}, new CandidatePair(){Value='C',Min=20,Max=54}, new CandidatePair(){Value='D',Min=55,Max=79}, new CandidatePair(){Value='E',Min=80,Max=99}, }; var rand = Guid.NewGuid().GetHashCode() % 100; var ret = from cp in candidateList where rand >= cp.Min && rand <= cp.Max select cp.Value; }
DECLARE @sql VARCHAR(700) SET @sql = 'DECLARE @table TABLE(id varchar(8)) INSERT into @table' DECLARE @i INT ; SET @i = 0 WHILE ( @i < 2 ) BEGIN SET @sql = @sql + ' SELECT ''A'' UNION ALL ' SET @i = @i + 1 END SET @i = 0WHILE ( @i < 2 ) BEGIN SET @sql = @sql + ' SELECT ''B'' UNION ALL ' SET @i = @i + 1 END SET @i = 0WHILE ( @i < 7 ) BEGIN SET @sql = @sql + ' SELECT ''C'' UNION ALL ' SET @i = @i + 1 END SET @i = 0WHILE ( @i < 5 ) BEGIN SET @sql = @sql + ' SELECT ''D'' UNION ALL ' SET @i = @i + 1 END SET @i = 0WHILE ( @i < 4 ) BEGIN SET @sql = @sql + ' SELECT ''E'' UNION ALL ' SET @i = @i + 1 END SET @i = 0SET @sql = SUBSTRING(@sql, 1, LEN(@sql) - 10) + ' select top 1 id from @table order by newid() ' EXEC(@sql)
Random()是伪随机,这个是要解决的。
//获取一定概率发生的来路信息 Random rdTmp = new Random(Guid.NewGuid().GetHashCode()); int rst = rdTmp.Next(1, 100); //所有来路按比率从小到大升序排列 BLL.xxxx bllxxxx = new Bugu.BLL.xxxx(); List<Model.xxxx > mdxxxx = bllxxxx.GetModelList("1=1 order by bl asc" ); int tmpBlCount=0; foreach (Model.xxxx mdTmp in mdxxxx )//从第一个开始比较,找到第一个大于该随机数的 { tmpBlCount+=Convert.ToInt32(mdTmp.BL); if (rst < tmpBlCount) { break; } }参照一楼结合我实际情况写成这样了。
Random并不能保证严格按照这个概率选取字符,呵呵 static void Main(string[] args) { char[] chars = { 'A', 'B', 'C', 'D', 'E' }; double[] a = { 0.1, 0.1, 0.35, 0.25, 0.2}; int[] b = new int[5]; double[] c = new double[5]; for (int i = 0; i < 10001;) { i++; int index = -1; for (int m = 0; m < 5; m++) { c[m] = i * a[m] - b[m]; if (m == 0) index = 0; else if (c[m] > c[index]) index = m; } b[index]++; } for (int i = 0; i < 5; i++) Console.WriteLine("字符" + chars[i] + "个数为" + b[i]); Console.ReadLine(); }
char chRet = '\0';
Random rand = new Random();
int randNum = rand.Next(100); if (randNum < 10)
{
chRet = 'A';
}
else if (randNum < 10 + 10)
{
chRet = 'B';
}
else if (randNum < 10 + 10 + 35)
{
chRet = 'C';
}
else if (randNum < 10 + 10 + 35 + 25)
{
chRet = 'D';
}
else
{
chRet = 'E';
}
if (r.Next(0,10) < 10)
return A; 随机数控制概率参考
class CandidatePair
{
public char Value { get;set; }
public int Min {get;set;}
public int Max {get;set;}
}
static void Test()
{
var candidateList = new List<CandidatePair>()
{
new CandidatePair(){Value='A', Min=0,Max=9},
new CandidatePair(){Value='B',Min=10,Max=19},
new CandidatePair(){Value='C',Min=20,Max=54},
new CandidatePair(){Value='D',Min=55,Max=79},
new CandidatePair(){Value='E',Min=80,Max=99},
}; var rand = Guid.NewGuid().GetHashCode() % 100;
var ret = from cp in candidateList where rand >= cp.Min && rand <= cp.Max select cp.Value;
}
char[] map =
{
'A', 'A', 'A', .... x10个
'B', 'B', 'B', .... x10个
'C', 'C', 'C', .... x35个
'D', 'D', 'D', .... x25个
'E', 'E', 'E', .... x20个
};Random r = new Random();return map[r.next(100)]A: 10%概率被选中
B: 10%概率被选中
C: 35%概率被选中
D: 25%概率被选中
E: 20%概率被选中
char[] map =
{
'A', 'A',
'B', 'B',
'C', 'C', 'C', 'C', 'C', 'C', 'C'
'D', 'D', 'D', 'D', 'D',
'E', 'E', 'E', 'E'
};Random r = new Random();return map[r.next(20)];
DECLARE @sql VARCHAR(700)
SET @sql = 'DECLARE @table TABLE(id varchar(8)) INSERT into @table'
DECLARE @i INT ;
SET @i = 0
WHILE ( @i < 2 )
BEGIN
SET @sql = @sql + ' SELECT ''A'' UNION ALL '
SET @i = @i + 1
END
SET @i = 0WHILE ( @i < 2 )
BEGIN
SET @sql = @sql + ' SELECT ''B'' UNION ALL '
SET @i = @i + 1
END
SET @i = 0WHILE ( @i < 7 )
BEGIN
SET @sql = @sql + ' SELECT ''C'' UNION ALL '
SET @i = @i + 1
END
SET @i = 0WHILE ( @i < 5 )
BEGIN
SET @sql = @sql + ' SELECT ''D'' UNION ALL '
SET @i = @i + 1
END
SET @i = 0WHILE ( @i < 4 )
BEGIN
SET @sql = @sql + ' SELECT ''E'' UNION ALL '
SET @i = @i + 1
END
SET @i = 0SET @sql = SUBSTRING(@sql, 1, LEN(@sql) - 10)
+ ' select top 1 id from @table order by newid() '
EXEC(@sql)
Random rdTmp = new Random(Guid.NewGuid().GetHashCode());
int rst = rdTmp.Next(1, 100);
//所有来路按比率从小到大升序排列
BLL.xxxx bllxxxx = new Bugu.BLL.xxxx();
List<Model.xxxx > mdxxxx = bllxxxx.GetModelList("1=1 order by bl asc" );
int tmpBlCount=0;
foreach (Model.xxxx mdTmp in mdxxxx )//从第一个开始比较,找到第一个大于该随机数的
{
tmpBlCount+=Convert.ToInt32(mdTmp.BL);
if (rst < tmpBlCount)
{
break;
}
}参照一楼结合我实际情况写成这样了。
{
char[] chars = { 'A', 'B', 'C', 'D', 'E' };
double[] a = { 0.1, 0.1, 0.35, 0.25, 0.2};
int[] b = new int[5];
double[] c = new double[5];
for (int i = 0; i < 10001;)
{
i++;
int index = -1;
for (int m = 0; m < 5; m++)
{
c[m] = i * a[m] - b[m];
if (m == 0)
index = 0;
else if (c[m] > c[index])
index = m;
}
b[index]++;
}
for (int i = 0; i < 5; i++)
Console.WriteLine("字符" + chars[i] + "个数为" + b[i]);
Console.ReadLine();
}
{
'A', 'A',
'B', 'B',
'C', 'C', 'C', 'C', 'C', 'C', 'C'
'D', 'D', 'D', 'D', 'D',
'E', 'E', 'E', 'E'
};Random r = new Random();return map[r.next(20)];
int chance = DateTime.Now.Millisecond / 10;
if (chance < 10)
{
tmp = 'A';
}
else if (chance < 20)
{
tmp = 'B';
}
else if (chance < 55)
{
tmp = 'C';
}
else if (chance < 80)
{
tmp = 'D';
}
else
{
tmp = 'E';
}
我测试了一下 差距太大 SortedList<char, int> m = new SortedList<char, int>();
m.Add('A',0);
m.Add('B',0);
m.Add('C',0);
m.Add('D',0);
m.Add('E',0); for (int i = 0; i < 10000;i++ )
{
char chRet = '\0';
Random rand = new Random();
int randNum = rand.Next(100); if (randNum < 10)
{
chRet = 'A';
}
else if (randNum < 10 + 10)
{
chRet = 'B';
}
else if (randNum < 10 + 10 + 35)
{
chRet = 'C';
}
else if (randNum < 10 + 10 + 35 + 25)
{
chRet = 'D';
}
else
{
chRet = 'E';
}
for (int j = 0; j < m.Count;j++ )
{
if( m.Keys[j] == chRet)
{
int s = m.Values[j];
++s;
m.Remove(chRet);
m.Add(chRet,s);
break;
}
}
}
for (int i = 0; i < m.Count; i++)
{
Console.WriteLine("\t{0}:\t{1}",m.Keys[i],m.Values[i]);
}
Console.ReadLine(); }
Random rand = new Random();
int randNum = rand.Next(100); if (randNum < 10)
{
chRet = 'A';
}
else if (randNum < 10 + 10)
{
chRet = 'B';
}
else if (randNum < 10 + 10 + 35)
{
chRet = 'C';
}
else if (randNum < 10 + 10 + 35 + 25)
{
chRet = 'D';
}
else
{
chRet = 'E';
}