洗牌算法vba(洗牌算法js)

http://www.itjxue.com  2023-02-16 00:17  来源:未知  点击次数: 

excelVBA 要随机的排序,要怎么写代码丫

Sub?test()

Dim?ar(),?br(),?cr(),?tempr1(),?tempr2()

Dim?i,?j,?k,?n?As?Long

ar?=?Array("Shell",?"Case",?"Cover",?"Backcover",?"Back?Cover",?"housing",?"Skin",?"protection",?"protector",?"Protective",?"Pouch",?"Flip",?"Holster",?"Wallet",?"bumper")

br?=?Array("A",?"B")

ReDim?cr((UBound(ar)?+?1)?*?(UBound(br)?+?1)?-?1)

ReDim?tempr1((UBound(ar)?+?1)?*?(UBound(br)?+?1)?-?1)

For?i?=?0?To?UBound(ar)

????For?j?=?0?To?UBound(br)

????????tempr1(k)?=?ar(i)??"?"??br(j)

????????k?=?k?+?1

????Next

Next

k?=?0

Do?While?UBound(tempr1)?=?0

????Randomize

????cr(k)?=?tempr1(Int(Rnd()?*?(UBound(tempr1)?+?1)))

????If?UBound(tempr1)??0?Then?GoSub?Rtempr?Else?Exit?Do

????k?=?k?+?1

Loop

GoTo?e

Rtempr:

n?=?0

ReDim?tempr2(UBound(tempr1)?-?1)

For?i?=?0?To?UBound(tempr1)

????If?tempr1(i)??cr(k)?Then?tempr2(n)?=?tempr1(i):?n?=?n?+?1

Next

ReDim?tempr1(UBound(tempr2))

For?i?=?0?To?UBound(tempr1)

????tempr1(i)?=?tempr2(i)

Next

Return

e:

Range("A1").Resize(UBound(cr)?+?1,?1)?=?Application.WorksheetFunction.Transpose(cr)

End?Sub

rand()%30是什么意思?

编程语言中rand()表示产生一个随机整数,%30将随机数限制在[0,30),%10表示只取0-9这10个自然数。以python为例,random.randint(0,30)产生0-30的自然数:

扩展资料:

python中random.randint(a,b)可以产生一个在区间[a,b)之间的随机整数。

python中random.random()可以产生随机浮点数,浮点数范围在0-1之间:

参考资料:

python官方api文档

随机函数的随机字母

随机小写字母:=CHAR(INT(RAND()*26)+97)

随机大写字母:=CHAR(INT(RAND()*26)+65)

随机大小写混合字母:=CHAR(INT(RAND()*26)+if(INT(RAND()*2)=0,65,97))

有些情形下,我们需要生成一个不重复的随机序列。

比如:我们要模拟洗牌,将一副扑克牌去掉大小怪后剩下的52张打乱。

比较笨的方法是在1-52间每生成一个随机数后,检查该随机数是否出现过,如果是第一次出现,就放到序列里,否则重新生成一个随机数作检查。在 excel worksheet里面用这种办法,会造成if多层嵌套,不胜其烦,在VBA里面做简单一些,但是效率太差,越到序列的后端,效率越差。

当然也有比较好的办法,在VBA里面,将a(1)-a(52)分别赋予1-52,然后做52次循环,例如,第s次生成一个1-52间的随机数r,将a(s)与a(r)互换,这样的话,就打乱了原有序列,得到一个不重复的随机序列。

VBA里这个算法是很容易实现的,但是,出于通用性和安全考虑,有的时候我们并不希望用VBA,我们来看看在worksheet里面如何利用内置函数实现这个功能。

(1)在A1-A52间填入=INT(RAND()*52)+1,产生1-52间的随机数,注意这里是有重复的

(2)在B1-B52间填入1-52

(3)在C54-BB54填入1-52

(4)在C1填入=IF(ROW()=C$54,INDEX(B$1:B$52,INDEX($A$1:$A$52,C$54)),IF(ROW()=INDEX($A$1:$A$52,C$54),INDEX(B$1:B$52,C$54),B1))。

分项解释:

a:ROW()=C$54,如果当前行等于当前交换所排的序号

b:INDEX(B$1:B$52,INDEX($A$1:$A$52,C$54)),返回在B1到B52中选择A1:A52中的第C54个值

c:IF(ROW()=INDEX($A$1:$A$52,C$54),否则的话,如果当前行等于A1:A52中第C54个值,则:

d:INDEX(B$1:B$52,C$54),返回B1:B52中的第C54个值

e:若以上条件都不满足,则返回B1

(5)将C1复制到C1:BA52这个区域里面

(6)在BA1:BA52中,我们就得到了一个不重复的随机序列,按F9可以生成一个新序列。

随机产生六位数字密码=INT(RAND()*(899999-10001))+100001

EXCEL生成前2位是大写字母,中间4位是小写字母,后两位是数字

=CHAR(65+INT(RAND()*16))CHAR(65+INT(RAND()*16))CHAR(97+INT(RAND()*16))CHAR(97+INT(RAND()*16))CHAR(97+INT(RAND()*16))CHAR(97+INT(RAND()*16))INT(RAND()*10)INT(RAND()*10)

在A1中输入公式=rand()*100000,表示随机数乘以一个比较大的数,然后往下填充N个单元格。在B1中输入排序公式=rank(A1,A:A),双击填充,或往下填充N个单元格,B1到BN就是你所需要的N个不同随机数了 #include stdlib.h

rand()

srand()

标准C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。

rand()函数没有输入参数,直接通过表达式rand()来引用;例如可以用下面的语句来打印两个随机数:

printf(Random numbers are: %i %i\n,rand(),rand());

因为rand()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的两个值,所以说C语言的随机并不是真正意义上的随机。

为了使程序在每次执行时都能生成一个新序列的随机值,我们通常通过为随机数生成器提供一粒新的随机种子。函数 srand()(来自stdlib.h)可以为随机数生成器播散种子。只要种子不同rand()函数就会产生不同的随机数序列。srand()称为随机数生成器的初始化器。 文件名: rand_srand.c /*Thisprogramgeneratesandprintstenrandomintegersbetween1andRAND_MAX*/#includestdio.h#includestdlib.hintmain(){unsignedintseed;/*申明初始化器的种子,注意是usignedint型的*/intk;printf(Enterapositiveintegerseedvalue:\n);scanf(%u,seed);srand(seed);printf(RandomNumbersare:\n);for(k=1;k=10;k++){printf(%i,rand());printf(\n);}return0;}当提供的种子相同时,随机数序列也时相同的。而且当种子为1时,与不使用srand()函数时一样的,也就是说rand()函数默认情况下初始化种子值为1;

在stdlib.h 中这两个函数的原型是:

int rand();

void srand (unsigned int);

srand(time(0)); i=rand(); 这样i就是一个真正意义上的随机数。 rand()产生伪随机数,srand函数提供种子,种子不同产生的随机数序列也不同,所以通常先调用srand函数 time(0)返回的是系统的时间(从1970.1.1午夜算起),单位:秒,种子不同当然产生的随机数相同几率就很小了。

几种扑克牌洗牌算法

洗牌的

几种话先设定好洗牌方式几种比方对分上下交l以及交织洗牌然扑克牌后用随机数生成函数确定单步洗牌作牌的数量多反复几遍即可。

的一个合理的定义就是算法

一副扑克张牌有种陈列方式。

这样做的好处:

给出的洗牌算算法应该可以等概率地生成这种结果中的一种

如何设计一个公平的洗牌算法

可以使用knuth洗牌算法。

Knuth洗牌算法:对于有n个元素的数组来说,为了保证洗牌的公平性,应该要能够等概率的洗出n!种结果。开始数组中有五个元素,在前五个数中随机选一个数与第五个数进行交换,每个数都有五分之一的概率被交换到最后一个位置;。

在前四个数中随机选一个数与第四个数进行交换,每个数都有五分之一的概率被交换到第四个位置。在前三个数中随机选一个数与第三个数进行交换,每个数都有五分之一的概率被交换到第三个位置。综上所述,每个数都有相等的概率被放到任意一个位置中,即每个位置中出现任意一个数的概率都是相同的,这就是公平的洗牌算法。

洗牌的方法

里夫鲁式洗牌法,是难度特别高,也特别酷炫的洗牌法。右手持牌,拇指放在一端,其余三指放在另一端,食指弯曲贴于牌的背面。然后将左手食指伸直,上心向上,放于牌的前端,这时轻轻放松右手拇指,使牌的下部分落在左手指尖上。将左手食指指尖放在左手牌的背面。左手手指弯曲,在右手协助下,树起左手的牌。

用左手拇指拿起左手的牌的上端。这时,要左手手指持牌动作与右手一致。将两手的牌弯曲大致相同的弧度,注意使除拇指外的其余四指都保持弯曲,并使两手的牌上端相对。然后将手指伸出,与其余三指并列在一起。这时,控制好拇指的力量,并逐渐放松其余手指。然后牌便会飞在一起。用双手使牌叠在一起,完成整个过程。

(责任编辑:IT教学网)

更多

推荐安全技术文章