将指定范围内不重复的随机数输到数组中———组件
提示:关于随机数与数组的函数小组件
##函数体
bool Rander(int rander[], int MaxLen, int Min, int Max) //改造一个数组使其,有一组(不重复)随机数,需要time.h头文件
{ //注:因为随机数不重复,所以随机数的取值范围不能小于数组最大长度
if((Max - Min) + 1 < MaxLen) //即: (Max - Min) + 1 > MaxLen
return false;
int temp, flag, i = 0;
for(int i = 0; i < Max; i++)
rander[i] = -1;
srand((unsigned)time(NULL));
while(i < MaxLen)
{
flag = 1;
temp = rand() % (Max - Min + 1) + Min; //随机数范围
for (int j = 0; j < MaxLen; j++)
{
if (temp == rander[j])
{
flag = 0;
break;
}
}
if (flag == 1)
{
rander[i] = temp;
i++;
}
}
return true;
}
##测试
int main()
{
int rander[4];
Rander(rander, 4, 1, 4);
for(int i = 0; i < 4; i++)
{
printf("%d", rander[i]);
}
}
这种随机数的产生非常无脑
很浪费计算机的算力,还有一种方式
bool Rander(int rander[],int randerNew[] ,int min, int max) //闭区间
{
int temp, t;
if (min >= max) //即: (Max - Min) + 1 > MaxLen
return false;
for (int i = 0; i + min <= max; i++)
rander[i] = i + min;
for (int i = 0; i < max - min + 1; i++)
{
temp = rand() % (max - min + 1 - i);
randerNew[i] = rander[temp];
while (temp < max - min + 1 - i)
{
rander[temp] = rander[temp + 1];
temp++;
}
}
return true;
}
使用两个数组,一个记入一个进行随机的筛选,每选完一个数后,将其后面的元素全部移动一个位置,同时随机数产生随机数的范围缩小一个数,进而达到随机的效果。
将其应用给随机筛子()
高深一点就是可以映射对熵增(一个系统中,个物质都会趋于混乱)的另一种观点——庞加莱猜想(在一个有限的空间中,经过一定时间,系统会回到最初的状态(类似于穷举))
#include <stdio.h>
#include <iostream>
#include <time.h>
void RoundNumber(char chars[], int chars_point[], int randerNew[], int chars_Length, int i);
bool Rander(int rander[],int randerNew[], int Min, int Max);
int main()
{
int flag1 = 0;
srand((unsigned)time(NULL));//随机数种子
char chars[] = {'A','B', 'C', 'D','E','F','G'};
int chars_point[7];
int chars_pointNew[7];
RoundNumber(chars, chars_point, chars_pointNew, 7, 1);
}
void RoundNumber(char chars[],int chars_point[], int randerNew[], int chars_Length, int i = 1)
{
int flag = 0;
Rander(chars_point, randerNew, 0, 6);
printf("第%d次:", i++);
for (int i = 0; i < chars_Length; i++)
{
printf("%c ", chars[randerNew[i]]);
if (i < chars_Length - 1)
{
if (chars[randerNew[i]] < chars[randerNew[i + 1]])
flag++;
}
}
printf("\n");
if (flag < chars_Length - 1)
RoundNumber(chars, chars_point, randerNew, chars_Length, i);
else exit(0);
}
//其中rander[], randerNew[] 数组是在外面创立(无需做任何处理)
bool Rander(int rander[],int randerNew[] ,int min, int max) //闭区间
{
int temp;
if (min >= max) //即: (Max - Min) + 1 > MaxLen
return false;
for (int i = 0; i + min <= max; i++)
rander[i] = i + min;
for (int i = 0; i < max - min + 1; i++)
{
temp = rand() % (max - min + 1 - i);
randerNew[i] = rander[temp];
while (temp < max - min + 1 - i)
{
rander[temp] = rander[temp + 1];
temp++;
}
}
/* for (int i = 0; i < max - min; i++)
{
temp = rand() % (max - min - i ) + 1 + i;
t = rander[i];
rander[i] = rander[temp];
rander[temp] = t;
}*/
return true;
}
将ABCDEFG,随机打乱,经1277次回到最初的顺序