如何使产生的随机数不太偏?

ayaoaaa 2011-05-18 10:20:18
我产生0-7的随机数,一共产生20个随机数字,但经常出现某个数出现4、5次,而某个数就1次或者干脆没有。如何干预,使产生的随机数平均一点
【vb代码】
for i=1 to 20

Randomize Timer
j=int(rnd()*8)
next i

请高手支招啊
...全文
240 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
CherylNatsu 2011-05-21
  • 打赏
  • 举报
回复
初始化随机数种子要放在循环外。
Katy_Perry 2011-05-21
  • 打赏
  • 举报
回复
下面这段改一下
{ a[i]=(int)ran.next(0,7)+1;
for(int j=0;j<i;j++)
if(a[i]==a[j])
break;
}
改成goto语句
{one
a[i]=(int)ran.next(0,7)+1;
for(int j=0;j<i;j++)
if(a[i]==a[j])
goto one;
}
Katy_Perry 2011-05-21
  • 打赏
  • 举报
回复
这是C#的做法,和VB应该差不了多少。。


int[]a=new int[20];
Random ran=new Random();
for(int i=0;i<a.length;i++)
{ a[i]=(int)ran.next(0,7)+1;
for(int j=0;j<i;j++)
if(a[i]==a[j])
break;
}
foreach(int n in a)
{console.write("{0}\0",n);}
cnmhx 2011-05-20
  • 打赏
  • 举报
回复
你用的随机数发生器不好。
另外,不要使用最前面的20个随机数,放弃几百个后在保存20个会好一些的。
liuli1983a 2011-05-20
  • 打赏
  • 举报
回复
可考虑对已产生过的随机数进行标记或统计,丢弃不合适的随机数,重新生成直到合适。

数不多的情况下的一种实现:
int GetRndValue()
{
#define RND_VALUES {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7}
#define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0]))

static const int s_values[] = RND_VALUES;
static int s_dynValues[] = RND_VALUES;
static int s_dynValuesNum = sizeof(s_dynValues) / sizeof(s_dynValues[0]);

int index, value;

if (s_dynValuesNum == 1)
{
/* 取值范围只有一个元素时,直接获取该元素,并恢复取值范围至起始状态 */

value = s_dynValues[0];

memcpy(s_dynValues, s_values, sizeof(s_values));
s_dynValuesNum = sizeof(s_dynValues) / sizeof(s_dynValues[0]);
}
else
{
/* 有多个元素时,从取值范围中随机获取一个值,并将其从取值范围中移除 */

index = (int)(rand() % s_dynValuesNum);
value = s_dynValues[index];

DelOneElem(s_dynValues, s_dynValuesNum, index);
s_dynValuesNum--;
}

return value;

#undef RND_VALUES
#undef ARRAY_SIZE
}
lanayata 2011-05-20
  • 打赏
  • 举报
回复
0-7这几个数产生的概率是不一样的,1-20可以分为三组,1-8,9-16,17-20,很显然概率是不同的,1,2,3,4产生的概率高,5,6,7,0产生的概率小!
renke 2011-05-20
  • 打赏
  • 举报
回复
设个数组记录每个数字的出现次数,一旦生成某数字之后,计数加一之后是否超过4,超过就放弃该次生成的数,继续下次。。。
bsnow 2011-05-19
  • 打赏
  • 举报
回复
具体怎么实现你参看http://www.ask.com/wiki/LFSR。
bsnow 2011-05-19
  • 打赏
  • 举报
回复
你可以使用 最大线性移位寄存器的方式来实现。
lzy18lzy 2011-05-19
  • 打赏
  • 举报
回复
取时间,进行一些异或操作
dragonsky_w 2011-05-19
  • 打赏
  • 举报
回复
这种算法是采用了概率的机制,程序时没有办法控制的……你这个问题让人很纠结啊
booksoon 2011-05-19
  • 打赏
  • 举报
回复
20次太少,再多点~~~
用心飞翔 2011-05-19
  • 打赏
  • 举报
回复
lz写错了吧?
j=int(rnd()*8)
这个应该是
j=int(rnd()/8)
little_angel 2011-05-19
  • 打赏
  • 举报
回复
这种现象可以用概率论的思想来思考。
little_angel 2011-05-19
  • 打赏
  • 举报
回复
随机数就是随机产生的,他的随机性就是平均分布的。。。在你的程序里分布不均匀,应该是因为你的随机数的范围太小了,,0--7.范围大一些,就能看出踏实平均分布的了
昵称很不好取 2011-05-19
  • 打赏
  • 举报
回复
洗牌算法产生随机数,不会VB,用了C语言,楼主凑合着看
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

int main()
{
int k[20];
int i = 0;
int index = 0;
int temp = 0;

for(i=0; i<20; ++i){
k[i] = i%8;
}

srand((unsigned)time(0));
for(i=20; i>0; --i){
index = rand()%i;
temp = k[index];
k[index] = k[i-1];
k[i-1] = temp;
}

for(i=0; i<20; ++i)
printf("%d ",k[i]);
printf("\n");

return 0;
}

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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