不重复随机数列生成

本文介绍了一种使用C++实现生成k个不重复随机数的方法。通过创建一个大小为k的数组,利用随机下标选择未输出过的元素,并将其添加到结果数组中,以确保生成的数列不重复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

随机生成k个不重复的随机数(或生成0至k-1以随机顺序构成的数列)

算法:

rand不直接产生值,而是产生下标,下标可以重复,但要保证数组中都是不重复且没有输出过的数字


①一个大小为k的数组temp,temp[i]=i;一个随机下标的范围range,range初始为k;一个随机数组result

②随机生成0至range-1的一个下标index,将temp[index]放入result

③temp[index]=temp[range-1]

④range--,转②

代码:

#pragma once
#include<iostream>
#include<vector>
#include<time.h>
using namespace std;

//返回k个不同随机数按序组成的vector(以随机顺序返回0至k-1构成的vector
vector<int> diffRand(int k)
{
	vector<int> result(k);
	vector<int> flag(k);
	for (int i = 0; i < k; i++)
		flag[i] = i;
	int range = k;//随机下标的范围
	srand((unsigned int)time(0));
	for (int i = 0; i < k; i++)
	{
		int randIndex = rand() % range;
		result[i] = flag[randIndex];
		flag[randIndex] = flag[range - 1];
		range--;
	}
	return result;
}

void main()
{
	vector<int> result = diffRand(10);
	for (int i = 0; i < (int)result.size(); i++)
		cout << result[i] << ' ';
	cout << endl;
	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值