用VB做:定义一个变量M,M从1到N共N个数中随机取值,循环N次,取N次值,每次都不能重复。应该怎么写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用VB做:定义一个变量M,M从1到N共N个数中随机取值,循环N次,取N次值,每次都不能重复。应该怎么写相关的知识,希望对你有一定的参考价值。

看见您在回答一个随机数问题的时候提到过这个问题。
地址如下:
http://zhidao.baidu.com/question/318617812.html
所以就专门来问您了。
N=10
For N
Randomize M= int((N * rnd) + 1)
MsgBox "M=" & M & ""
NEXT
上面这个,因为已经给N赋值给10,会从1到10这10个值中取10次值,但可能重复。

在这里向您请教不重复的办法。
比如1到10十个数,每次取1个,取十次。

有一个问题要问:你是一次性取出10个值,还是每一次只取出一个值?
每次打开程序后,要取几次值?
不重复指的是这次打开程序与上次打开程序所取的一个值不同,还是打开程序后在使用中不重复?是用按钮调用吗?还是程序自动判断条件具备了才取值?……
这里,有多种情况,我不知道你说的是哪一种。
请明示。
'.............................................................................
方法很多,我常用的是数组随机乱序法。
Dim num() As Integer
Dim length As Integer
Dim N As Integer
'.....制作数组,用于存放种子函数..........................
Private Sub makeArray()
Dim i As Integer
For i = 0 To N - 1
num(i) = i
Next
End Sub

'.......乱序函数.....................................
Private Sub rndArray()
Randomize
Dim k As Integer
Dim j As Integer
Dim i As Integer
For i = 0 To N - 1
k = Int(Rnd * N)
j = num(i)
num(i) = num(k)
num(k) = j

Next
End Sub

'....初始化运行函数...........
Private Sub init()
N = 10 '此处改为你的入口。比如 N=Text1.Text+0
ReDim num(N)
makeArray
rndArray

End Sub

'....初始化运行源动力...........
Private Sub Form_Load()
init'改为你自己的初始化方式
End Sub

'..............出口.......应用.......................................
Private Sub Command1_Click()
If length = N Then Exit Sub
Print num(length) '将此出口改为你的自己需要的样式
length = length + 1
End Sub

请根据自己的实际情况修改。
张志晨来自:求助得到的回答
参考技术A 数的范围从1到N,要取N次值,还要每次都不一样,这就相当于把包含1到N的数组随机乱序。

随机数

给定了一个能够生成1~n的随机函数,求一个生成1~m的随机函数。为了方便,假设n<m,m<n*n。

有一种比较通用,但不一定高效的方法是:

1、 z = (n - 1)*rand_n()+rand_n();此时z的取值范值范围是[1,n*n],而且是等概率的取值。

2、 剩下的就是将[1,n*n]映射到[1,m]。因为m<n*n,所以只需要以m个数作为一个取值区间,从小到大进行映射,到最后的几个数不满m个,就舍弃,重新取值。

  所以,首先确定最后舍弃的那几个数的个数,re = n*n%m,

3、最后,当z的值在(n*n - re, n*n]之间的时候,重新取值。在[1,n*n-re]时,对m取余,加一即可。

int rand_m()

{

  int z;

  int re = n*n%m;

  do

  {

  z = (n - 1)*rand_n() + rand_n();

  } while(z > n*n - re)

  return  z%m + 1;

}

这种方法,采用舍弃一部分不符合要求的数值的方式,原则上舍弃的数值的比例越少越好,最差的情况是舍弃约50%的数值。比如z的范围是[1,10],m是[1,6],那么7,8,9,10都是要舍弃的。

以上是关于用VB做:定义一个变量M,M从1到N共N个数中随机取值,循环N次,取N次值,每次都不能重复。应该怎么写的主要内容,如果未能解决你的问题,请参考以下文章

从M个数中随机等可能的取出N个的问题

MATLAB如何把n个数不重复地随机分为m组

JAVA从数组中选取N个数,使其和为M实现算法?

如何用python实现随机抽取? 规则如下: 所有数据分成n组; 每组有m个数; 抽取数据时,每组

[JAVA] - 高效的从 m 个元素中随机选中 n 个

随机数