在研究图像分类的课题过程中,模型的训练需要将图像随机打乱。由于老师要求使用C++语言编写程序,因此编写一个随机打乱数组数据的程序,将数组元素替换为下标,可以实现图像打乱。例如,实现数组的数据从0,1,2,3,4,5转换到2,5,4,3,1,0。元素不变,次序改变。其步骤如下:
输入:样本数目num;存储图像原始下标数组ids[num],满足图像下标与数组下标一一对应,即ids[i]=i,i=1,2,...,num
输出:存储随机打乱下标的数组randIds[num],满足元素与ids相同,但是次序改变
步骤:
For i = num,num-1,...,1
随机抽取的元素下标 = rand() % i 目标:产生一个0~i的随机数
将该元素赋值到randIds
ids[随机抽取的元素下标] = ids[i-1] 目标:将抽取的元素替换
综上,其思想循环产生一个随机数,随机数是提取元素下标,随机数的范围从大到小,并不断将抽取的元素替换此次抽取的临界元素(下次抽取范围不再覆盖的元素)。
void main()
{
int sampleNum = 10;//样本数目
int * rand_ids = new int[sampleNum];//打乱下标
//原始下标,图像
int * ids = new int[sampleNum];
for (int i = 0; i < sampleNum; i++)
ids[i] = i;
//打乱下标
int j = 0;
for (int i = sampleNum; i > 0; i--)
{
int tmpID = rand() % i; //
rand_ids[j++] = ids[tmpID]; //
cout << ids[tmpID] << " ";
ids[tmpID] = ids[i-1];
}
}