一道腾讯面试题

  1. /**
  2. * 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
  3. */  
  4. using System;  
  5. using System.Collections.Generic;  
  6. using System.Linq;  
  7. using System.Text;  
  8.   
  9. namespace ConsoleApplication1  
  10. {  
  11.     class Program  
  12.     {  
  13.         staticvoid Main(string[] args)  
  14.         {  
  15.             Rand10 rand10 = Rand10.GetInstance();  
  16.             long total = 9999999;  
  17.             //记录1~10的数产生的次数   
  18.             int[] numArray = newint[10];  
  19.             for (long i = 0; i < total; i++)  
  20.             {  
  21.                 int randomNumber = rand10.Next();  
  22.                 numArray[randomNumber - 1]++;  
  23.             }  
  24.             //打印产生各数的概率   
  25.             for (int i = 0; i < numArray.Length; i++)  
  26.             {  
  27.                 Console.WriteLine(string.Format("产生{0}的概率是:{1:0.00000}", i + 1, (Double)numArray[i] / total));  
  28.             }  
  29.             Console.ReadLine();  
  30.         }  
  31.     }  
  32.     //1~7的随机数产生类   
  33.     publicclass Rand7  
  34.     {  
  35.         privatestatic Rand7 _rand7;  
  36.         privatereadonly Random _random = new Random();  
  37.         private  Rand7()  
  38.         {    
  39.   
  40.         }  
  41.         publicstatic Rand7 GetInstance()  
  42.         {  
  43.             if(_rand7==null)  
  44.             {  
  45.                 _rand7 = new Rand7();  
  46.             }  
  47.             return _rand7;  
  48.         }  
  49.         //获得随机数   
  50.         publicint Next()  
  51.         {  
  52.             return _random.Next(1, 8);  
  53.         }  
  54.     }  
  55.   
  56.     //1~10的随机数产生类   
  57.     publicclass Rand10  
  58.     {  
  59.          privatestatic Rand10 rand10;  
  60.          private Rand7 _rand7 = Rand7.GetInstance();  
  61.         private  Rand10()  
  62.         {  
  63.   
  64.         }  
  65.         publicstatic Rand10 GetInstance()  
  66.         {  
  67.             if(rand10==null)  
  68.             {  
  69.                 rand10 = new Rand10();  
  70.             }  
  71.             return rand10;  
  72.         }  
  73.         //获得随机数   
  74.         publicint Next()  
  75.         {  
  76.             int num;  
  77.             //均匀产生1、 2 、3、4、5   
  78.             while (true)  
  79.             {  
  80.                 num = _rand7.Next();  
  81.                 if (num <= 5)  
  82.                     break;  
  83.             }  
  84.   
  85.             while (true)  
  86.             {  
  87.                 int n = _rand7.Next();  
  88.                 if (n == 4)  
  89.                     continue;  
  90.                 //n大于4的数字有5、6、7,因为是由Rand7产生的,所以概率均匀   
  91.                 if (n > 4)  
  92.                 //因为num只可取值1、2、3、4、5并且取值概率均匀,num*2可得2、4、6、8、10也概率均匀   
  93.                     num *= 2;  
  94.                 //n小于4的数字有1、2、3,因为是由Rand7产生的,所以概率均匀   
  95.                 else  
  96.                 //因为num只可取值1、2、3、4、5并且取值概率均匀,num*2-1可得1、3、5、7、9也概率均匀   
  97.                     num = num * 2 - 1;  
  98.                 break;  
  99.             }  
  100.             return num;  
  101.         }  
  102.     }  
  103. }  
/** 
 * 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。 
 */ 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            Rand10 rand10 = Rand10.GetInstance(); 
            long total = 9999999; 
            //记录1~10的数产生的次数 
            int[] numArray = new int[10]; 
            for (long i = 0; i < total; i++) 
            { 
                int randomNumber = rand10.Next(); 
                numArray[randomNumber - 1]++; 
            } 
            //打印产生各数的概率 
            for (int i = 0; i < numArray.Length; i++) 
            { 
                Console.WriteLine(string.Format("产生{0}的概率是:{1:0.00000}", i + 1, (Double)numArray[i] / total)); 
            } 
            Console.ReadLine(); 
        } 
    } 
    //1~7的随机数产生类 
    public class Rand7 
    { 
        private static Rand7 _rand7; 
        private readonly Random _random = new Random(); 
        private  Rand7() 
        {   
 
        } 
        public static Rand7 GetInstance() 
        { 
            if(_rand7==null) 
            { 
                _rand7 = new Rand7(); 
            } 
            return _rand7; 
        } 
        //获得随机数 
        public int Next() 
        { 
            return _random.Next(1, 8); 
        } 
    } 
 
    //1~10的随机数产生类 
    public class Rand10 
    { 
         private static Rand10 rand10; 
         private Rand7 _rand7 = Rand7.GetInstance(); 
        private  Rand10() 
        { 
 
        } 
        public static Rand10 GetInstance() 
        { 
            if(rand10==null) 
            { 
                rand10 = new Rand10(); 
            } 
            return rand10; 
        } 
        //获得随机数 
        public int Next() 
        { 
            int num; 
            //均匀产生1、 2 、3、4、5 
            while (true) 
            { 
                num = _rand7.Next(); 
                if (num <= 5) 
                    break; 
            } 
 
            while (true) 
            { 
                int n = _rand7.Next(); 
                if (n == 4) 
                    continue; 
                //n大于4的数字有5、6、7,因为是由Rand7产生的,所以概率均匀 
                if (n > 4) 
                //因为num只可取值1、2、3、4、5并且取值概率均匀,num*2可得2、4、6、8、10也概率均匀 
                    num *= 2; 
                //n小于4的数字有1、2、3,因为是由Rand7产生的,所以概率均匀 
                else 
                //因为num只可取值1、2、3、4、5并且取值概率均匀,num*2-1可得1、3、5、7、9也概率均匀 
                    num = num * 2 - 1; 
                break; 
            } 
            return num; 
        } 
    } 
} 
posted on 2012-11-09 17:19  wencansz  阅读(194)  评论(0编辑  收藏  举报