当前位置:编程学习 > C/C++ >>

两种洗牌算法比较

// 洗牌算法.cpp : Defines the entry point for the console application.
//
//算法1原理:
/*
1.用一个整型数组记录各个位置是否已经放置了数,如果放置了则不为0,否则为0。所以在算法开始的时候,初始化此数组每个元素的值都为0.

2.每次产生一个0-53之间的数,看这个位置是否放置了数,如果已经放置了,则继续采用同样的方法找一个随机的位置进行判断,如果这个位置还未放置,则设置此位置。

3.反复执行步骤2,直到所有的位置都放好了数。
*/
//算法2原理
//先对数组进行初始化,然后随机交换数组中任意两个元素。交换的次数越多就越随机。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle1(int a[],int num)
{
	int card,pos;
	for(card=1;card<=num;card++)
	{
		do 
		{
			pos=rand()%(num-1);
		} while (a[pos]!=0);
		a[pos]=card;
	}
}
void shuffle2(int a[],int num)
{
	for(int i=1;i<=num;i++)
		a[i-1]=i;
	int tmp=0,p1,p2;
	int cnt=1023;
	while (cnt--)
	{
		p1=rand()%num;
		p2=rand()%num;
		tmp=a[p1];
		a[p1]=a[p2];
		a[p2]=tmp;
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int a[54]={0};
	int b[54]={0};
	clock_t start=clock();
	shuffle1(a,54);
	clock_t end=clock();
	float time=(float)(end-start)/CLOCKS_PER_SEC;
	printf("算法1运行时间:%fs\n",time);
	start=clock();
	shuffle2(b,54);
	end=clock();
	time=(float)(end-start)/CLOCKS_PER_SEC;
	printf("算法2运行时间:%fs\n",time);
	for(int i=0;i<54;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	for(int i=0;i<54;i++)
	{
		printf("%d ",b[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,