取随机数问题

wmvbl 2015-03-24 12:30:50
Private Sub Command1_Click()
Dim a
a = GetRnd(5)
For i = 0 To UBound(a)
Debug.Print a(i)
Next i
End Sub


Function GetRnd(Ints As Long)
Dim i As Long
Dim TmpArray() As Long '声明临时动态数组。
ReDim TmpArray(Ints) ' 初始化临时动态数组上标
Dim TmpRetArray() As Long '声明临时返回动态数组。
ReDim TmpRetArray(Ints) ' 初始化临时返回动态数组上标
For i = 0 To Ints - 1
TmpArray(i) = i
Next i
Dim ArrayEnd As Long '定义数组最大位
ArrayEnd = Ints - 1
Dim TmpRnd As Long '随机数存储变量
Randomize '随机数
For i = 0 To Ints - 1
TmpRnd = Int(Rnd() * ArrayEnd)
TmpRetArray(i) = TmpArray(TmpRnd)
TmpArray(TmpRnd) = TmpRetArray(ArrayEnd)
ArrayEnd = ArrayEnd - 1
Next i
GetRnd = TmpRetArray
End Function



发现我循环输出的时候 有好多的 00 并不是1-5的随机数。。 不知道什么原因。特请大神给看看~
...全文
175 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmvbl 2015-03-24
  • 打赏
  • 举报
回复
@zhao4zhong1 赵4老师
wmvbl 2015-03-24
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:

Randomize '随机数
挪到
Form1_Load中



挪了。还是一样的、是不是我函数写的有问题? 能否帮忙调试看看~

赵4老师 2015-03-24
  • 打赏
  • 举报
回复
将 Randomize '随机数 挪到 Form1_Load中
赵4老师 2015-03-24
  • 打赏
  • 举报
回复
随机必然有重复,所谓“不重复的随机”实际上是洗牌。洗牌算法参考下面:(尽管是C语言)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}
wmvbl 2015-03-24
  • 打赏
  • 举报
回复
引用 7 楼 Tiger_Zhao 的回复:
    ReDim TmpArray(Ints - 1) 'VB 数组指定的是上标不是个数'
    ReDim TmpRetArray(Ints - 1)
    ...
    For i = 0 To Ints - 1
        TmpRnd = Int(Rnd() * ArrayEnd)
        TmpRetArray(i) = TmpArray(TmpRnd)
        TmpArray(TmpRnd) = TmpArray(ArrayEnd) '<- 问题在这里'
        ArrayEnd = ArrayEnd - 1
    Next i
问题解决了。。谢谢!!!
Tiger_Zhao 2015-03-24
  • 打赏
  • 举报
回复
    ReDim TmpArray(Ints - 1) 'VB 数组指定的是上标不是个数'
ReDim TmpRetArray(Ints - 1)
...
For i = 0 To Ints - 1
TmpRnd = Int(Rnd() * ArrayEnd)
TmpRetArray(i) = TmpArray(TmpRnd)
TmpArray(TmpRnd) = TmpArray(ArrayEnd) '<- 问题在这里'
ArrayEnd = ArrayEnd - 1
Next i
wmvbl 2015-03-24
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
    For i = 0 To Ints - 1
        TmpRnd = Int(Rnd() * ArrayEnd)
        TmpRetArray(i) = TmpArray(TmpRnd)
        TmpArray(TmpRnd) = TmpRetArray(ArrayEnd)
        ArrayEnd = ArrayEnd - 1
    Next i
举例说明 开始时: TmpArray = (0,1,2,3,4,0) TmpRetArray = (0,0,0,0,0,0) 当 i=0 循环假设 TmpRnd=1,交换后 TmpArray = (0,0,2,3,4,0) TmpRetArray = (1,0,0,0,0,0) TmpArray(1) = 0 还会参与下次选取? 你的原先的意图是什么?
原意是 参数如果是10 就取10个随机数。但是这10个随机数不能重复。而且这10个随机数的范围是0-9。 我发现我改后还是错的。 @Tiger_Zhao @Tiger_Zhao
wmvbl 2015-03-24
  • 打赏
  • 举报
回复
大概知道哪里错了,应该是定义数组的时候没减1导致后面多了个0,移位的时候出现了0。
Tiger_Zhao 2015-03-24
  • 打赏
  • 举报
回复
    For i = 0 To Ints - 1
TmpRnd = Int(Rnd() * ArrayEnd)
TmpRetArray(i) = TmpArray(TmpRnd)
TmpArray(TmpRnd) = TmpRetArray(ArrayEnd)
ArrayEnd = ArrayEnd - 1
Next i

举例说明
开始时:
TmpArray = (0,1,2,3,4,0)
TmpRetArray = (0,0,0,0,0,0)
当 i=0 循环假设 TmpRnd=1,交换后
TmpArray = (0,0,2,3,4,0)
TmpRetArray = (1,0,0,0,0,0)
TmpArray(1) = 0 还会参与下次选取?
你的原先的意图是什么?

7,764

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧