大哥:
    
     用c#实现,随机产生0--9之间的数字,每次产生一位数字,但要求这个数字每次全不一样???
比如,点一下按钮产生 9,再点一下产生 2,总之下一次的和上一次不能一样,请问怎么做??????比如这次产生了 22这个数字,下一次就不能产生22,狂求大哥,我们在做一个抽奖程序!

解决方案 »

  1.   

    弄个数组,保存已经产生的随机数,新产生随机数后到里面找一找,有重复的话就再生成一次,easy
      

  2.   

    using System;
    using System.Data;
    using System.Collections;
    using System.Data.SqlClient;
    using Microsoft.DVAP.CommonFunction.CommonUtil;namespace PrizeOperate
    {
    /// <summary>
    /// 随机数生成器
    /// </summary>
    public class RndCreator
    {
    //错误信息
    public string strErr = ""; /// <summary>
    /// 得到一个范围内的随机数字
    /// </summary>
    /// <param name="iLowNum">随机生成的上限值</param>
    /// <param name="iHighNum">随机生成数字的下限值</param>
    /// <returns></returns>
    public int GetRndSingleNum(int iLowNum,int iHighNum)
    {
    if ((iLowNum<0)||(iHighNum<0))
    {
                    strErr = "上限或下限的值不能 小于 零!";
                    return -1;
    } if (iLowNum > iHighNum)
    {
    strErr = "上限值 不能小于 下限值!";
    return -2;
    } int iRndNum;
    Random rnd = new Random((iHighNum-iLowNum+1) * unchecked((int)DateTime.Now.Ticks));
    //返回的数值为: 一个大于或等于 iLowNum 且小于 iHighNum 的 32 位带符号整数;所以要iHighNum加1
    iRndNum = rnd.Next(iLowNum,(iHighNum+1));
    return iRndNum;
    }
    /// <summary>
    /// 得到一组不同的随机数字
    /// </summary>
    /// <param name="iCount">要随机产生数字的个数</param>
    /// <param name="iLowNum">每个数字的上限值</param>
    /// <param name="iHighNum">每个数字的下限值</param>
    /// <returns></returns>
    public int[] GetRndArrayNum(int iCount,int iLowNum,int iHighNum)
    {
    int iRndNum;
    int[] iRndArrayNum; if ((iLowNum<0)||(iHighNum<0))
    {
    strErr = "上限或下限的值不能 小于 零!";
    return null;
    } if (iLowNum > iHighNum)
    {
    strErr = "上限值 不能小于 下限值!";
    return null;
    } if (iCount <=0 )
    {
    strErr = "随机产生的数量不能 小于或等于 零!";
    return null;
    }
                iRndArrayNum = new Int32[iCount];
                
    for (int i=0;i<iCount;i++)
    {
    try
    {
    iRndNum  =  GetRndSingleNum(iLowNum,iHighNum);
    //如果随机产生的数字重复,再产生随机数字,直到不重复为止
    while(ifRepeate(iRndNum,iRndArrayNum)==1)
        {
                            iRndNum  =  GetRndSingleNum(iLowNum,iHighNum);                                                                        
    }
    iRndArrayNum[i] = iRndNum;
    }
    catch(Exception e)
    {
    strErr = e.Message;
    throw;
                    }
    }
    return iRndArrayNum;
    } //判断在数组中是否有重复的数字.0:没有重复;1:有重复;-1:出错
    private int ifRepeate(int iNum,int[] iArrayNum)
    {
    int bRes = 0; if (iArrayNum.GetLength(0)<=0)
    {
    bRes = -1;
    return bRes;
    }
    for (int i=0;i<iArrayNum.GetLength(0)-1;i++)
    {
    if (iNum == iArrayNum[i])
    {
    bRes = 1;
    return bRes;
    }
    }
    return bRes;
    } /// <summary>
    /// 得到任意位数的随机字符数字,每一字符位数字在规定的上限值和下限值范围内.
    /// </summary>
    /// <param name="iSize">随机数字的位数</param>
    /// <param name="iLowNum">每个数字位的上限值</param>
    /// <param name="iHighNum">每个数字位的下限值</param>
    /// <returns></returns>
    public string GetRndStr(int iSize,int iLowNum,int iHighNum)
    {
    string RndStr=""; int iFirst = 0;
    int[] rtArray = new Int32[iSize]; Random rf = new Random((iHighNum-iLowNum+1) * unchecked((int)DateTime.Now.Ticks));
    iFirst = rf.Next(iLowNum,iHighNum+1);
    rtArray[0]=iFirst; //得到第一位
    RndStr += rtArray[0].ToString();
    for(int i=1;i<iSize;i++)
    {
    //每次给不同的种子值,避免每次数字重复
    Random rdm = new Random(i * iFirst * unchecked((int)DateTime.Now.Ticks)); 
    //返回的数值为: 一个大于或等于 iLowNum 且小于 iHighNum 的 32 位带符号整数;所以要iHighNum加1
    rtArray[i] = rdm.Next(iLowNum,iHighNum+1);
    iFirst = rtArray[i];
    RndStr += rtArray[i].ToString();
    }
    return RndStr;
    }
    /// <summary>
    /// 得到一组任意指定位数的随机字符数字
    /// </summary>
    /// <param name="iCount">要随机产生的各数</param>
    /// <param name="iSize">每随机数字的位数</param>
    /// <param name="iLowNum">每个数字位的上限值</param>
    /// <param name="iHighNum">每个数字位的下限值</param>
    /// <returns>返回一组随机数字数组</returns>
    public string[] GetRndArrayStr(int iCount,int iSize,int iLowNum,int iHighNum)
    {
    string[] strRndArrayNum;
    string strRndNum; if ((iLowNum<0)||(iHighNum<0))
    {
    strErr = "上限或下限的值不能 小于 零!";
    return null;
    } if (iLowNum < iHighNum)
    {
    strErr = "上限值 不能小于 下限值!";
    return null;
    } if (iSize <=0 )
    {
    strErr = "每个随机数字的位数字不能 小于 零!";
    return null;
    } if (iCount <=0 )
    {
    strErr = "随机产生的数量不能 小于或等于 零!";
    return null;
    } strRndArrayNum = new string[iCount];
               
    for (int i=0;i<iCount;i++)
    {
    try
    {
    strRndNum = GetRndStr(iSize,iLowNum,iHighNum); //如果随机产生的数字重复,再产生随机数字,直到不重复为止
    while(ifStrRepeate(strRndNum,strRndArrayNum)==1)
    {
    strRndNum = GetRndStr(iSize,iLowNum,iHighNum);                                                                 
    }
    strRndArrayNum[i] = strRndNum;
    }
    catch(Exception e)
    {
    strErr = e.Message;
    throw;
    }
    }
        return strRndArrayNum;
    } //判断在数组中是否有重复的数字.0:没有重复;1:有重复;-1:出错
    private int ifStrRepeate(string strNum,string[] strRndArrayNum)
    {
    int bRes = 0; if (strRndArrayNum.GetLength(0)<=0)
    {
    bRes = -1;
    return bRes;
    }
    for (int i=0;i<strRndArrayNum.GetLength(0)-1;i++)
    {
    if (strNum == strRndArrayNum[i])
    {
    bRes = 1;
    return bRes;
    }
    }
    return bRes;
    } }
    }
      

  3.   

    来测试一下
    int codeCount = 7; //彩票位数
    string randomCode = "";
    int temp = -1;
    Random rand = new Random();
    for(int i=0;i<codeCount;i++)
    {
       int j = rand.Next(codeCount); //从 allChar 字符中随机取数字
       if(randomCode.IndexOf(j.ToString()) != -1 )
       {
         i = i - 1;
         continue;
       }
       temp = j;
       randomCode += j.ToString();
    }
    return randomCode;
      

  4.   


    //test
    btclick(object sender, System.EventArgs e)
    {
    Random rand = new Random();
    int i = rand.Next(10);
    ViewState["temp"] = i;
    if(ViewState["temp"] != null)
    int j = Convert.ToInt32(ViewState["temp"].ToString());
    while (i == j)
    {
    i = rand.Next(10);
    ViewState["temp"] = i;
    }
    Console.Write(ViewState["temp"].ToString());
    }
      

  5.   

    晕到一片,每次产生一位数字,而且不能一样,这么麻烦,还是改asp吧,以前我用asp做成功,改c#了,真不懂