FisherYates洗牌算法

洗牌算法

Fisher–Yates随机置乱算法也被称做高纳德置乱算法,通俗说就是生成一个有限集合的随机排列。Fisher-Yates随机置乱算法是无偏的,所以每个排列都是等可能的,当前使用的Fisher-Yates随机置乱算法是相当有效的,需要的时间正比于要随机置乱的数,不需要额为的存储空间开销

例子:
1、各列含义:范围、当前数组随机交换的位置、剩余没有被选择的数、已经随机排列的数
在这里插入图片描述
第一轮:从1到8中随机选择一个数,得到6,则交换当前数组中第8和第6个数
在这里插入图片描述
第二论:从1到7中随机选择一个数,得到2,则交换当前数组中第7和第2个数
在这里插入图片描述
下一个随机数从1到6中摇出,刚好是6,这意味着只需把当前线性表中的第6个数留在原位置,接着进行下一步;以此类推,直到整个排列完成。
在这里插入图片描述
截至目前,所有需要的置乱已经完成,所以最终的结果是:7 5 4 3 1 8 2 6

#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int fun1(char * date,int length)
{
	int i,j;
	while(--length)
	{
		srand(time(0));
		i = rand()%(length+1);
		char temp  = date[i];
		date[i]  = date[length];
		date[length] = temp;

	}

}

int main()
{

	char arr[8] ="1234567";
	int n = strlen(arr);
	fun1(arr,n-1);
	puts(arr);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35433716/article/details/88977205
今日推荐