一个关于Random算法的问题

指定范围数字 生成随机序列 数字不连续

例如:范围【1-5】  输入 1 3 5 2 4

           Stopwatch sp = new Stopwatch();
            sp.Start();//开始计时
            foreach (var item in GetRandomList(9999, 10000))
            {
                Console.WriteLine(string.Format("{0}", item.Value.ToString()));
            }
            sp.Stop();
            Console.WriteLine(String.Format("耗时{0}", sp.ElapsedMilliseconds));
            Console.Read();

  

RmNum<RmNext 下面这种算法计算是无压力的
        /// <summary>
        /// 指定范围数字 生成随机序列 数字不连续
        /// </summary>
        /// <param name="RmNum">随机序列个数</param>
        /// <param name="RmNext">范围</param>
        /// <returns></returns>
        public static Dictionary<int, int> GetRandomList(int RmNum, int RmNext)
        {
            Dictionary<int, int> dictionary = new Dictionary<int, int>();
            Random rm = new Random();
            for (int i = 0; dictionary.Count < RmNum; i++)
            {
                int nValue = rm.Next(1, RmNext);
                if (i == 0)
                {
                    dictionary.Add(i, nValue);
                }
                if (!dictionary.ContainsValue(nValue))
                {
                    ArrayList arrayList = new ArrayList();
                    foreach (var item in dictionary)
                    {
                        arrayList.Add(item.Value);
                    }
                    if (dictionary.Count > 0)
                    {
                        if (Math.Abs(Convert.ToInt32(arrayList[arrayList.Count - 1]) - Convert.ToInt32(nValue)) > 1)
                        {
                            dictionary.Add(i, nValue);
                        }
                    }
                }
            }
            return dictionary;
        }

  

RmNum<RmNext 下面这种算法,如果RmNum和RmNext趋近的时候就会出现效率问题
    /// <summary>
        /// 指定范围数字 生成随机序列 数字不连续
        /// </summary>
        /// <param name="RmNum">随机序列个数</param>
        /// <param name="RmNext">范围</param>
        /// <returns></returns>
        public static List<int> GetRandomListNew(int RmNum, int RmNext)
        {
            int[] array = new int[RmNext];
            List<int> List = new List<int>();
            for (int i = 0; i <= array.Length - 1; i++)
            {
                array[i] = i + 1;
                if (i == 0)
                {
                    List.Add(array[i]);
                }
            }
            for (int i = 0; List.Count < RmNum; i++)
            {
                if (!List.Contains(List[List.Count - 1]))
                {
                    if (List.Count > 0)
                    {
                        if (Math.Abs(Convert.ToInt32(List[List.Count - 1]) - Convert.ToInt32(List[List.Count])) > 1)
                        {
                            List.Add(List[List.Count - 1]);
                        }
                    }
                }
            }
            return List;
        }

  当RmNum=RmNext 时候两种算法都会计算很长时间,甚至计算不出来,当时试着用hashtable,hashtable 可以存储但是是无序的,于是就用了Dictionary。

指定范围数字,生成随机序列,数字不连续,我这个只是随机把一种组合打印出来,如果把所有组合都打印出来该怎么办???范围【1-5】   1 5 2 然后是不是就死循环了?

求大神解惑!!!

时间: 2024-10-09 03:48:33

一个关于Random算法的问题的相关文章

如何评价一个伪随机数生成算法的优劣

以下来自我在知乎的回答.http://www.zhihu.com/question/20222653 谈到随机性,这大概是一个令人困惑哲学问题吧.随机行为精确地说究竟指的是什么,最好是有定量的定义.Kolmogorov曾提出一种判定随机性的方法: 对于无穷的随机数序列,无法用其子序列描述.J.N.Franklin则认为:如果一个序列具有从一个一致同分布的随机变量中独立抽样获得的每个无限序列 都有的性质,则是随机的.这些定义都不是很精确,有时甚至会导致矛盾.可见数学家在谈到这个问题时是多么的审慎.

一个简单的算法,定义一个长度为n的数组,随机顺序存储1至n的的全部正整数,不重复。

前些天看到.net笔试习题集上的一道小题,要求将1至100内的正整数随机填充到一个长度为100的数组,求一个简单的算法. 今天有空写了一下.代码如下,注释比较详细: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Text.RegularExpressions; 6 7 namespace TestNumber 8 { 9 cl

一个由IsPrime算法引发的细节问题

//******************************* // //    2014年9月18日星期四,于宿舍撰写 //    作者:夏华林 // //******************************** 好久没有没有更新博客了,最近确实烦心事儿挺多,已经大三了,真的静下心来好好看看书了. 今天要说的,就是一个由IsPrime算法引发的细节问题,我这里说的细节,是我所认为的,若有不妥,望指正! 一个简单的IsPrime算法的实现如下: 1 bool IsPrime(int

如何开发一个异常检测系统:如何评价一个异常检测算法

利用数值来评价一个异常检测算法的重要性 使用实数评价法很重要,当你用某个算法来开发一个具体的机器学习应用时,你常常需要做出很多决定,如选择什么样的特征等等,如果你能找到如何来评价算法,直接返回一个实数来告诉你算法的好坏,那样你做决定就会更容易一些.如现在有一个特征,要不要将这个特征考虑进来?如果你带上这个特征运行你的算法,再去掉这个特征运行你的算法,得到返回的实数,这个实数直接告诉你加上这个特征算法是变好了还是变坏了,这样你就有一种更简单的算法来确定是否要加上这个特征. 为了更快地开发出一个异常

一个基于RSA算法的Java数字签名例子

原文地址:一个基于RSA算法的Java数字签名例子 一.前言: 网络数据安全包括数据的本身的安全性.数据的完整性(防止篡改).数据来源的不可否认性等要素.对数据采用加密算法加密可以保证数据本身的安全性,利用消息摘要可以保证数据的完整性,但是还有一点就是数据来源的不可否认性(也就是数据来自哪里接收者是清楚的,而且发送数据者不可抵赖). 有些方案曾经使用消息认证码(MAC)来保证数据来源于合法的发送着,但是利用消息认证码会带来一个问题,就是通讯双方必须事先约定两者之间的通讯用共享密码.在我们的互联网

C语言计算程序中某一个函数或算法的执行时间

计算程序中某一个函数或算法的执行时间 #include <stdio.h> #include <time.h> #include <stdlib.h> int main() { long i = 10000000L; clock_t start, finish; double duration; printf( "Time to do %ld empty loops is ", i) ; start = clock(); while( i-- );

一个关于AdaBoost算法的简单证明

下载本文PDF格式(Academia.edu) 本文给出了机器学习中AdaBoost算法的一个简单初等证明,需要使用的数学工具为微积分-1. Adaboost is a powerful algorithm for predicting models. However, a major disadvantage is that Adaboost may lead to over-fit in the presence of noise. Freund, Y. & Schapire, R. E.

一个任务调度问题-----算法导论

一.问题描述 在单处理器上具有期限和惩罚的单位时间任务调度问题. 二.算法原理 任务调度问题就是给定一个有穷单位时间任务的集合S,集合S中的每个任务都有一个截止期限di和超时惩罚wi,需要找出集合S的一个调度,使得因任务误期所导致的总惩罚最小,这个调度也称为S的一个最优调度. 实现任务的最优调度主要就是利用贪心算法中拟阵的思想.如果S是一个带期限的单位时间任务的集合,且I是所有独立的任务集构成的结合,则对应的系统M=(S,I)是一个拟阵.利用拟阵解决任务调度问题的算法原理主要就是将最小化迟任务的

SSE图像算法优化系列十:简单的一个肤色检测算法的SSE优化。

在很多场合需要高效率的肤色检测代码,本人常用的一个C++版本的代码如下所示: void IM_GetRoughSkinRegion(unsigned char *Src, unsigned char *Skin, int Width, int Height, int Stride) { for (int Y = 0; Y < Height; Y++) { unsigned char *LinePS = Src + Y * Stride; // 源图的第Y行像素的首地址 unsigned char