VB洗牌算法产生随机数组

算法图示:

运行效果:

详细代码:

Option Explicit
‘洗16张牌(0-15),方便用十六进制显示
Private Const CARDMAX = 15
Dim Card() As Long

Private Sub 洗牌()
    Dim i&, l&, r&, t&
    l = CARDMAX
    For i = 0 To CARDMAX
        r = Rnd * l
        t = Card(l)
        Card(l) = Card(r)
        Card(r) = t
        l = l - 1
    Next i
End Sub

Private Sub Command1_Click()
    Call 洗牌
    ‘输出洗牌结果和牌点总和
    Dim i As Long
    Dim n As Long
    For i = 0 To CARDMAX
        Print Hex(Card(i));
        n = n + Card(i)
    Next i
    Print " - SUM:" & n
End Sub

Private Sub Form_Load()
    Randomize
    ‘初始化牌
    ReDim Card(CARDMAX)
    Dim i As Long
    For i = 0 To CARDMAX
        Card(i) = i
    Next i
End Sub
时间: 2024-10-26 15:32:16

VB洗牌算法产生随机数组的相关文章

Javascript 洗牌算法,打乱数组,随机获取元素

//利用洗牌算法Array.prototype.shuffle=function(){ var i,t,m=this.length; while(m){ i=Math.floor(Math.random()*m--); t=this[m]; this[m]=this[i]; this[i]=t; } return this;} var arr=[1,2,3,4,5];console.log(arr.shuffle());console.log(arr.slice(0,2));

随机算法之30万员工抽取10万员工(洗牌算法)

算法方面不是我的强项,所以遇到这个问题,记录一下解决方法: 最开始的时候,做法是从random中来随机选取一个,然后再判断已有列表中是否存在, 然后以此重复,看到这里,会算法的同学肯定会说这明显不行:就好比多少人中生日为一天的概率大于50%: 所以然后查找了一些资料,看到了洗牌算法:包括多种变种吧. 这里说一下我参考的解决办法: 比如有30万个元素的列表,那么第一次随机选择一个:记录位置是x: 然后把元素的最后一个位置元素存入位置x,然后把最后位置的元素删除: (这里在交换的时候,需要判断这个元

随机洗牌算法

随机洗牌算法: 时间和空间复杂度都为O(n). 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxn = 54; 6 7 void random_shuffle(vector<int> &a) 8 { 9 srand(int(time(0))); 10 int aSize = a.size(); 11 for(int i = 1; i != aSize; ++i) { 12 int j

随机洗牌算法Knuth Shuffle和错排公式

Knuth随机洗牌算法:譬如现在有54张牌,如何洗牌才能保证随机性.可以这么考虑,从最末尾一张牌开始洗,对于每一张牌,编号在该牌前面的牌中任意一张选一张和当前牌进行交换,直至洗到第一张牌为止.参考代码如下: void knuth() { for (int i = 54; i > 1; i--) { int id = rand() % (i - 1) + 1; swap(a[i], a[id]); } } 由上述方法可知,每一张牌经过洗牌之后一定不会出现在原来位置,那么一共会有多少情况呢,这其实就

算法之洗牌算法

洗牌算法是我们常见的随机问题,在玩游戏.随机排序时经常会碰到,一个最常用的地方就是组卷.它可以抽象成这样:M以内的所有自然数的随机顺序数组. package com.math; import java.util.Random; /** * @author summer * */ public class Shuffle { static final int[] a = new int[54]; static Random rnd = new Random(); static{ for(int i

洗牌算法Fisher-Yates以及C语言随机数的产生

前些天在蘑菇街的面试中碰到一道洗牌的算法题,拿出来和大家分享一下! 原题是:54张有序的牌,如何无序的发给3个人? 这个题是运用经典的洗牌算法完成.首先介绍一种经典的洗牌算法--Fisher-Yates.现在大家在网上看到,大多是Fisher-Yates算法的变形.将本来O(n2),简化到了O(n).代码如下: #include<stdio.h> #include <stdlib.h> void func(char *, int); void main() { char a[7]

JS洗牌算法

洗牌算法 以请将1~10共10个数字的数组随机打乱为列子,目前我知道的有两种方法,一种sort()方法和push()方法. 一.sort方法: var arr=[1,2,3,4,5,6,7,8,9]; function Upset(a,b) { //用Math.random()函数生成0~1之间的随机数与0.5比较,返回-1或1   return Math.random()>.5 ? -1 : 1;  //简化上面的方法 // return 0.5 - Math.random();  } arr

【每日算法】洗牌算法

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

(笔试题)洗牌算法

题目: 给定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