如何更高效率的生成随机数组

现在我们有一个需求:生成长度为100的随机数组(数值范围0~99),数值无重复。

通常方法:

var _len = 100, _arrUsedFlag = [],_arrR=[];
            for(var i=0;i<_len;i++){//初始化标志位数组,表示第N个数组是否已经被生成过
                _arrUsedFlag.push(false);
            }
            i=0;
            for(;i<_len;i++){
                var _isNewNum=false;
                //如果没有生成不重复的随机数,循环
                while(_isNewNum==false){
                    var _newNum=Math.floor(Math.random()*100);
                    //如果生成了新的无重复的随机数
                    if(!_arrUsedFlag[_newNum]){
                        _arrR.push(_newNum);
                        _arrUsedFlag[_newNum]=true;
                        _isNewNum=true;
                    }
                }
            }

在上面的例子中,我们需要一个数组来标记某个数是否已经被生成。在循环中,我们需要判断是否某个随机数已经生成过,如果已经生成,那么我们就再生成一次。
假设有一个大小为N的随机序列,那么按照上面的算法,生成第一个随机数的期望为1,第二个随机数的期望为N/(N-1),第三个随机数的期望为N/(N-2),以此类推。这样子的效率很低。

下面我们来看另一种方法:

 1 var _len = 100, _arrR = [];
 2             for (var i = 0; i < _len; i++) {
 3                 _arrR.push(i);
 4             }
 5             i = 0;
 6             for (; i < _len; i++) {
 7                 //每次
 8                 var _r = Math.floor(Math.random() * (_len - i));
 9                 var _temp = _arrR[_r];
10                 _arrR[_r] = _arrR[_len - 1 - i];
11                 _arrR[_len - 1 - i] = _temp;
12             }

在上面的方法里,我们其实要做的就是对0~N-1(N=100)排序的数组进行重新排列。
第一次在N个数中随机一个值,将其存放在数组的最后一位。
第二次在N-1个数中随机一个值,将其存放在数组的倒数第二位。
第k次在N-k个数中随机一个值,将其存放在数组的N-k位。

第二种算法无论在时间和空间复杂度方面都比第一种要低许多.

 

 

 

 

 

转载于:https://www.cnblogs.com/kbqncf/p/3761089.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期新这些源码资源,以适应各平台技术的最新发展和市场需求。
好的,下面是一个使用快速排序法的Java程序,可以满足你的要求: ```java import java.util.concurrent.ThreadLocalRandom; public class Main { public static void main(String[] args) { // 创建一个14个长的数组 int[] arr = new int[14]; // 插入一个固定值 int fixedValue = 10; arr[0] = fixedValue; // 插入13个随机数 ThreadLocalRandom random = ThreadLocalRandom.current(); for (int i = 1; i < arr.length; i++) { arr[i] = random.nextInt(); } // 快速排序 quickSort(arr, 0, arr.length - 1); // 折半查找 int index = binarySearch(arr, fixedValue); System.out.println("固定值 " + fixedValue + " 的位置是 " + index); } // 快速排序 private static void quickSort(int[] arr, int left, int right) { if (left < right) { int pivotIndex = partition(arr, left, right); quickSort(arr, left, pivotIndex - 1); quickSort(arr, pivotIndex + 1, right); } } private static int partition(int[] arr, int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[right]; arr[right] = temp; return i + 1; } // 折半查找 private static int binarySearch(int[] arr, int key) { int low = 0; int high = arr.length - 1; while (low <= high) { int mid = (low + high) / 2; if (arr[mid] == key) { return mid; } else if (arr[mid] < key) { low = mid + 1; } else { high = mid - 1; } } return -1; } } ``` 这个程序中,我们首先创建一个14个长的数组,并插入一个固定值。然后,我们使用ThreadLocalRandom生成13个随机数,并将它们插入到数组中。 接下来,我们使用快速排序法对数组进行排序。最后,我们使用折半查找法查找固定值的位置,并输出结果。 请注意,快速排序法和冒泡排序法的时间复杂度分别为O(nlogn)和O(n^2),因此快速排序法的效率高。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值