例  :A: 10%概率被选中
B: 10%概率被选中
C: 35%概率被选中
D: 25%概率被选中
E: 20%概率被选中
总共加起来是100%,也就是说一定会选中其中一个字母。
一次只能选择一个字母

解决方案 »

  1.   


                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';
                }
      

  2.   

    Random r=new Random();
    if (r.Next(0,10) < 10)  
      return A;  随机数控制概率参考
      

  3.   

    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;
              }
      

  4.   

    在操作系统中记得页面置换那里,我是规定0,1,2,3,然后用next(4)去筛选,如果小于2,就选A,那么A的概率就为50%
      

  5.   


    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%概率被选中
      

  6.   

    可以同时除以5,这样就更简单了:
    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)];
      

  7.   


    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)
      

  8.   

    Random()是伪随机,这个是要解决的。
      

  9.   

                        //获取一定概率发生的来路信息
                        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;
                            }
                        }参照一楼结合我实际情况写成这样了。
      

  10.   

    利用'A'的ascall码加上(int)(4*(rand()/(rand_max+1))),不就可以利用随机数的概率来找这几个字母啦!
      

  11.   

    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();
            }
      

  12.   

    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)];
      

  13.   

    1楼是不严谨的,没考虑到那个随机数类是个伪随机数,必须指定不同的种子来初始化才行。其实与其用那个随机数类,不如直接去用系统当前时间的毫秒数。            char tmp = new char();
                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';
                }
      

  14.   

    这样是不是B 就不是10%了    A和B都是10%  
    我测试了一下  差距太大             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();        }
      

  15.   

          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';
                }