给定N张扑克牌,设计一个洗牌算法

均匀洗牌即可

方法1:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. static int num = 54;//num为纸牌数目
  5. //随机数发生器,产生[n,m)之间的随机数
  6. int getRandNum(int n,int m)
  7. {
  8. if(n==m)
  9. {
  10. return n;
  11. }
  12. else if(n>m)
  13. {
  14. return -1;
  15. }
  16. time_t time1;
  17. srand(( unsigned int)time(&time1));
  18. return rand() % (m - n + 1) + n ;
  19. }
  20. //方法1
  21. void xipai(int i,int j)
  22. {
  23. if(num==0)
  24. {
  25. return;
  26. }
  27. int temp = getRandNum(i,j);
  28. if(temp<0)
  29. {
  30. return;
  31. }
  32. num--;
  33. printf("%d\t",temp);
  34. xipai(i,temp-1);
  35. xipai(temp+1,j);
  36. }
  37. int main()
  38. {
  39. xipai(1,num);
  40. return 0;
  41. }

方法2:

  1. for(int i = 0; i < N; i++){
  2. int j = random(i, n-1);
  3. swap(card[i], card[j]);
  4. }

来自为知笔记(Wiz)

时间: 2024-08-05 15:16:00

给定N张扑克牌,设计一个洗牌算法的相关文章

扑克牌的完美洗牌算法

思路: 递归思想.我们有n张牌,不妨先假设有一个洗牌函数shuffle(....),能完美的洗出n-1张牌 .拿第n张牌来打乱前面n-1的洗牌顺序,从而得到n张牌的最终结果. 代码如下: 1 #include <iostream> 2 #include <cstdlib> 3 using namespace std; 4 5 //随机指定区域内的数 6 int MyRand(int low, int high) 7 { 8 return low + rand() % (high -

设计一个洗牌的程序?就是将这副牌进行随机交换

#include <iostream> #include <cstdlib> #include<ctime> using namespace std; void Swap(int &a, int &b){// 有可能swap同一变量,不能用异或版本 int t = a; a = b; b = t; } void RandomShuffle(int a[], int n){ //洗牌程序 for(int i=0; i<n; ++i){ int j =

(笔试题)洗牌算法

题目: 给定N张扑克牌和一个随机函数,设计一个洗牌算法 思路: 假设数组A存的是扑克牌代表的数字,则洗牌的过程就是数组中元素交换的过程. 洗牌是个随机的过程,也是一个排列组合的过程. 假设有N张牌,则其排列组合的可能情况为N!=N*(N-1)*....*2*1. 有两种的随机洗牌函数: 1.A[i]=A[rand()%N] 2.A[i]=A[rand()%(N-i)] 但第一种情况得到的选择可能为N^N,而第二种情况为N! 因此第二种随机算法更符合. 代码: void shuffle(int a

一个时间O(n)的洗牌算法

1 //一种O(n)的洗牌算法 2 vector<int> randNUms(vector<int> &nums, int m) 3 { 4 int len = nums.size(); 5 if (len < m) 6 return {}; 7 8 vector<int> res; 9 for (int i = len - 1; i >= 0, m-- > 0; i--) 10 { 11 int r = rand() % i; 12 res.

一步一步写算法(之洗牌算法)

[ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 扑克牌洗牌是我们生活中比較喜欢玩的一个游戏.那么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在c执行库其中有一个随机函数rand,它能够生成0~32767之间的随意数.那么有没有可能利用这么一个函数对我们扑克牌进行随即洗牌呢? 在这里我抛砖引玉一下,谈一谈自己眼下已经看到的两个算法.欢迎朋友们谈一谈其它的方法. (1)全局洗牌法 过程例如以下所看到的: a)首先生成一个数组,大小为54

一步一步写算法(洗牌算法)

[ 声明:版权所有所有,欢迎转载.不用于商业用途. 联系我们:feixiaoxing @163.com] 扑克洗牌是我们的生命更喜欢玩游戏. 么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在c执行库其中有一个随机函数rand,它能够生成0~32767之间的随意数.那么有没有可能利用这么一个函数对我们扑克牌进行随即洗牌呢? 在这里我抛砖引玉一下,谈一谈自己眼下已经看到的两个算法.欢迎朋友们谈一谈其它的方法. (1)全局洗牌法 过程例如以下所看到的: a)首先生成一个数组,大小为54,初始化为

【每日算法】洗牌算法

洗牌算法 给定一个n个数的序列,设计一个算法将其随机打乱,保证每个数出现在任意一个位置的概率相同(也就是说在n!个的排列中,每一个排列出现的概率相同). 朴素的做法: 假设输入为数组num[length]. 随机选一个数,放到num[0]中,再随机选数,如果该数已经选过,重新选,直到该数未选过时放入num[1]中,以此类推,直到所有的数都选出来,很明显,这种选法一共有n!中可能,每种可能出现的概率都相同. 但是该做法效率不高,因为选过的数再选将耗费大量时间. 改进的洗牌算法: 基于以上算法的缺陷

【转】完美洗牌算法

转自:https://yq.aliyun.com/articles/3575 题目 有个长度为2n的数组{a1,a2,a3,…,an,b1,b2,b3,…,bn},希望排序后{a1,b1,a2,b2,….,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法. 来源 2013年UC的校招笔试题 思路一 第①步.确定b1的位置,即让b1跟它前面的a2,a3,a4交换: a1,b1,a2,a3,a4,b2,b3,b4 第②步.接着确定b2的位置,即让b2跟它前面的a3,a4交换: a

洗牌算法与蓄水池抽样

今儿看到了,就在此记录一下吧. 洗牌算法 递归做法:先将1~n-1洗牌,然后取随机数k(0<k<n),并交换n与k,代码很简单: 1 int[] shuffle(int[] cards, int n){ 2 if(n == 1){ 3 return cards; 4 } 5 shuffle(cards, n-1); 6 int k = random(1, n-1); 7 swap(card[k], card[n]); 8 return card; 9 } 也可以转成非递归的: 1 void s