程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 一種生成不重復數的算法

一種生成不重復數的算法

編輯:.NET實例教程

在編程中經常遇到一些類似的問題,比如做一個雙色球選號軟件,其中6個雙色球是從1到33之間選出6個數來,這6個數是不能重復的,這個問題就是我們今天要說的生成不重復數算法。
算法描述如下:從M個數中選出N個數來(0<N<=M),要求N個數之間不能有重復。
這個問題我以前用J2SE實現過,使用了ArrayList,每次隨機在指定范圍內選定一個數,然後查看結果集合中是否存在該數,如果存在繼續下一輪循環,如果不存在,就將該數保存到結果集合中去。使用這種算法雖然也能實現要求,缺點是判斷結果集合中是否存在該數時,需要通過一個循環來判斷,這會增加算法運行的時間,雖然時間復雜度為n,但多次重復,還是一筆不小的開銷。

下面要介紹的算法是,每次隨機取出一個數,之後將該數放置到集合的末尾去,這樣下次取隨機數的時候,只從1到目標集合個數-1個中隨機抽取,如此循環,這樣就避免了判斷在結果集合中判斷是否存在相沖突的數的過程。

算法代碼如下:



using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Management;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] range = new int[33];
            for (">int i = 0; i < 33; i++)//初始化范圍集合,從1到33
            {
                range[i] = i + 1;
            }
            int[] result = CreateNumbers(range, 6);
            for(int i=0;i<result.Length;i++)
            {
                Console.WriteLine("result[{0}]={1}", i, result[i]);
            }
            Console.ReadKey();
        }
  
        //取出不重復的6個數
    static int[] CreateNumbers(int[] range, int count)
        {
            int[] result = new int[count];
            Random random=new Random();
            int index = 0;
            int temp = 0;
&nbsp;           for (int i = 0; i < count; i++)
            {
                index=random.Next() % (range.Length-i);
                result[i] = range[index];
                //將當前已使用過的數移至集合末尾,並且將末尾原來沒有使用的數放到當前位置
                temp = range[range.Length - 1-i];
                range[range.Length - 1-i] =="COLOR: #000000"> range[index];
                range[index]=temp;
            }
            return result;
        }
       
    }
}
結果如下:


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved