从范围n中产生k(k<n)个不重复随机数

本文提供了一个Java类RandomNum,用于从指定范围n中生成k个不重复的随机数。该类通过内部实现确保每次生成的随机数互不相同,适用于需要随机数生成场景的开发者。
package com.rs.exam.util;

import java.util.ArrayList;
import java.util.List;
/**
 * 从范围n中产生k(k<n)个不重复随机数
 * @author rs
 *
 */
public class RandomNum {

 /**
  * 从list中随机取出count个不同的整数
  * @param list
  * @param count
  * @return relist
  */
 public static List<Integer> getRand(List<Integer> list, int count){  
  
  int [] num = new int[count];//记录下标,长度为count
  int size = list.size();//list的长度
  int [] rem = new int[size];//list的下标
  List<Integer> relist = new ArrayList<Integer>();//最终返回结果
  
  for(int i=0; i<rem.length; i++) {
   rem[i] = i;
  }
  for(int i=0; i<num.length; i++) {//循环count次,取出count个不同随机数
   int r = (int)(Math.random()*size);
   num[i] = rem­;
   relist.add(list.get(num[i]));
   rem­ = rem[size-1];
   size --;//每取出一个随机数,size就减1,即下一次在size-1的范围内取随机数,达到不重复的效果
  }  
  return relist;
 }

}


在C#中,有多种方法可以在一定范围生成重复随机数,以下是几种常见的实现方法: ### Fisher-Yates洗牌算法 该算法的基本思想是先初始化一个包含指定范围所有数字的有序数组,然后随机打乱数组顺序。以生成长度为100,元素为1 - 100的重复随机数数组为例: ```csharp using System; class Program { static void Main() { int[] numbers = new int[100]; for (int i = 0; i < 100; i++) { numbers[i] = i + 1; } Random random = new Random(); for (int i = numbers.Length - 1; i > 0; i--) { int j = random.Next(i + 1); int temp = numbers[i]; numbers[i] = numbers[j]; numbers[j] = temp; } foreach (int num in numbers) { Console.WriteLine(num); } } } ``` 这种方法适用于生成范围较大且需要全部元素的重复随机数序列,时间复杂度为O(n) [^1]。 ### 从数组中随机抽取并移除元素 通过在一个数组中随机选择元素,将其添加到结果数组中,然后将该元素从原数组移除,避免重复选择。以下是一个生成长度为10,范围在1 - 15的重复随机数数组的示例: ```csharp using System; class Program { static void Main() { int[] index = new int[15]; for (int i = 0; i < 15; i++) { index[i] = i + 1; } Random r = new Random(); int[] result = new int[10]; int site = 15; for (int j = 0; j < 10; j++) { int id = r.Next(0, site); result[j] = index[id]; index[id] = index[site - 1]; site--; } foreach (int num in result) { Console.WriteLine(num); } } } ``` 该方法适用于只需要部分元素的重复随机数序列,时间复杂度为O(k),其中k是需要生成随机数个数 [^2]。 ### 利用HashSet去重 HashSet 可以确保集合中的元素唯一,通过生成随机数并尝试添加到 HashSet 中,直到达到所需数量。以下是生成范围在1 - 100,数量为20的重复随机数的示例: ```csharp using System; using System.Collections.Generic; class Program { static void Main() { HashSet<int> uniqueNumbers = new HashSet<int>(); Random random = new Random(); int min = 1; int max = 100; int count = 20; while (uniqueNumbers.Count < count) { int num = random.Next(min, max + 1); uniqueNumbers.Add(num); } foreach (int num in uniqueNumbers) { Console.WriteLine(num); } } } ``` 这种方法简单直观,但在生成接近范围上限数量的重复随机数时,可能会因为重复尝试而效率降低 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值