这个问题怎么编写啊?小问题!

时间:2021-01-13 19:11:10
用随机函数随机产生从1到100的数,然后在用Edit框把他显示出来!要求Edit框中不能显示同样的数字!谢谢各位!欢迎各位来帮忙!

34 个解决方案

#1


是用Edit全部显示吗?

#2


这样的话,最多只能产生100次,因为如果超过了100次,根据抽屉原理,可知一定会产生重复。
我们可以利用这样一个算法,定义一个有100个元素的整型数组,然后开始产生随机数。如果产生了和前面不一样的,那么我们一次将这些数放入数组中,然后在产生下一个数的时候,和数组中的数进行比较,看是否重复,如果重复则重新产生随机数,直到不重复为止。程序可以这么写
  int i[100],times=0,j;
  do
  {
     i[times]=random(101)-1;
     for(j=0;j<times;j++)
     {
        if(i[times]==i[j]) break;
        break;
      }
    Edit1->Text=IntToStr(i[times]);
    times++;
  }
  while(times<=100);

#3


谢谢你!我先看看,是不是能够通过!ok?

#4


我这里有一个。。我给你说原理吧。程序我懒的写了。
定义一个数组array[0..99],

从0到9取一个随机数i
与第讲array[i]与array[100-i]的内容交换。
重复循环10次。

然后取数组中的0~9这10个元素,就是你要的不重复的随机数。

#5


crapex(编程浪子) 老兄啊!不行啊!我是要把这个放到一个Button的Click事件中的,我每次按一下就显示不同的结果!谢谢你,帮我再看看!

#6


还有没有人给我一点意见啊!各位朋友,来吧!我在线上等你们的答复!

#7


用我的试试啊。

#8


啊。。好象我的和你的要求不一样啊。呵呵。。

你的问题能不能说清楚点。

#9


你还不明白啊!我是用一个随机函数产生1到100的数,然后在Button的Click事件中将他们用Edit显示出来,但是每次显示的结果不相同!不需要把1到100的数都显示,只要能够显示几个就可以了!

#10


static int i[100],times=0,j;
    times++;
    for(j=0;j<times;j++)
    {
    i[times]=random(100)+1;
        if(i[times]!=i[j]&&times<=100)
        {
        Edit1->Text=i[times];
        break;
        }
      }
大家抢分呀!:))

#11


to lhr03(空空)

啊。。那就简单了。。你要产生几个就循环几次就可以了。放到数组中去啊。

代码就好象kekeguo()老兄说的一样。我懒的写了。呵呵。

#12


好的,我看看是不是能够运行!谢谢你!如果正常的一定给分

#13


ok!一切ok!好了谢谢你!我会给分的,老兄!kekeguo() 

#14


老兄!kekeguo()  你的程序有些问题,第一,你产生的随机数,总是有一定的规律的,例如第一次运行程序时Edit显示的是50,60,3,等等。当我重新再运行一次时产生同样的结果,这样产生的随机数由问题!第二,还是老问题,就是Edit重复显示数字,还是没有解决。希望那位高手再指点一下!!!

#15


random()并不是真正意义上的产生随机数的函数。
建议将时间加到随机因素里。

#16


试试这段程序:
先定义全局变量:int i[100],times=0;
    

    int l,j;
    randomize();
    l=random(100)+1;   //产生一个随机数付给临时变量
    for(j=0;j<times;j++)
    {
        if(l==i[j])  //如果产生的随机数与原有的相同,重新产生,再重新比较
        {
         l=random(100)+1;
         j=0;
        }
     }
     i[times]=l;  //将产生的与前面的值均不相同的值写到数组中(一定要后写,如果
                 //先写再判断就没有意义了).
    Edit1->Text=Edit1->Text+"  "+IntToStr(i[times]);
    times++;

#17


对不起,有个地方还有问题,即在循环中j=0;一句应改成j=-1;

#18


思路:将选中的数Numbers[pos]与数组中的最后一个数Numbers[Index]进行交换,下一次取数的时候从Numbers[0~Index-1]中取,直到所有100个数都被取出为止。即,将已经被使用过的数放到数组的后部,算法很快

int GetNumber(int* Numbers)
{
  int pos,result;
  static int Index = 99;           //存储已经用过的数的位置

  if(Index < 1)                    //如果用过超过100次,重置
    Index = 99;
  pos = random(Index+1);           //从0到Index之间随机取一个数,位置为pos
  result = *(Number+pos);          // 结果放到result中
  *(Number+pos) = *(Number+Index); //将Number[pos]和Number[Index]进行交换
  *(Number+Index) = result;        
  --Index;                         //下次取数的时候可选择的数范围为Numbers[0~Index-1]
  return result;                   // 返回结果
}
  

#19


关于:
-------------------------------------------------------------------------------
你的程序有些问题,第一,你产生的随机数,总是有一定的规律的,例如第一次运行程序时Edit显示的是50,60,3,等等。当我重新再运行一次时产生同样的结果,这样产生的随机数由问题!第二,还是老问题,就是Edit重复显示数字,还是没有解决。希望那位高手再指点一下!!! 
-------------------------------------------------------------------------------
请在调用GetNumber函数之前调用randomize函数一次即解决

#20


我那个确实完全错了……找个接口:昨天我困的不行了,后来直接睡觉去了。
改完了。再错我请你吃饭。
static int i[100],times=0,j;
    randomize();
    i[times]=random(100)+1;
    for(j=0;j<times;j++)
    {
        if(i[times]==i[j])
        {
         j=-1;
         i[times]=random(100)+1;
        }
        else if(times==100) return;
    }
    Edit1->Text=IntToStr(i[times]);
    times++;

winsky的方法很不错~~

#21


调试通过:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   int Rand[100],CurrRand;
   for(int k=0;k<=99;k++) Rand[k]=0;  //用于存放随机,并初始化
   randomize();
   for (int i=0;i<=99;i++)
   {
      CurrRand=random(100)+1;  //产生随机数
      while(IFExist(CurrRand,Rand,99))
      {
        CurrRand=random(100)+1;
      }
      Rand[i]=CurrRand;
   }

//测试
   AnsiString ShowVal="";
   int i=0;
   for(int z=0;z<=99;z++)
   {
     ShowVal=ShowVal+" "+IntToStr(Rand[z]);
     i=i+Rand[z];
   }
   Edit2->Text=IntToStr(i);
   Edit1->Text=ShowVal;

}

其中:
bool IFExist(int values,int *p,int i);//P指向Rand数,i为数组上标值;

bool IFExist(int values,int *p,int i)
{
   for(int j=0;j<=i;j++)
   {
     if(p[j]==values)
     {
        return true;   //存在返回真;
     }
   }
   return false;
}

    

#22


to wyb_45(小兵)

你有没有播撒随机种子啊。

#23


啊。。错了。。是对lhr03(空空)说的。

#24


好的,我现在再试一下,有什么问题,我在请教各位!

#25


我测试了好像暂时没有什么问题了

#26


kekeguo(壳壳果?) 我看你for的括号里面有问题啊 你的定义times=0;
但是在for(j=0;j<times;j++) j和times一开始都是零,

#27


第一次没有重复的问题,所以第一个不用作循环判断的。
times++以后,从1开始判断是不是和i[0]重复。

你小子想骗我请客……

#28


关注关注,upup

#29


没有了,我刚才没有注意到!是我的不对,我错了,I am sorry!

#30


hehe,没关系地……
你这个像是作业题嘛……

#31


youlione(请多指教) 你写的我是过了,是正确的,你是把rand产生的数先全部放到数组里面再显示,但是Edit里面不能放这么多数据啊!后面的都看不到了!

#32


你可以用ListBox显示!

#33


但是我不想看到全部的数据!我只有看到一个就可以了!

#34


你可以先产生一个随机数,然后用这个随机数作为下一个产生随机数的随机函数的种子,这样里产生的数字的随机性就会大很多,你甚至还可以将一些运算方法随机产生在将以前产生的随机数相互再运算这样就更随机了!

#1


是用Edit全部显示吗?

#2


这样的话,最多只能产生100次,因为如果超过了100次,根据抽屉原理,可知一定会产生重复。
我们可以利用这样一个算法,定义一个有100个元素的整型数组,然后开始产生随机数。如果产生了和前面不一样的,那么我们一次将这些数放入数组中,然后在产生下一个数的时候,和数组中的数进行比较,看是否重复,如果重复则重新产生随机数,直到不重复为止。程序可以这么写
  int i[100],times=0,j;
  do
  {
     i[times]=random(101)-1;
     for(j=0;j<times;j++)
     {
        if(i[times]==i[j]) break;
        break;
      }
    Edit1->Text=IntToStr(i[times]);
    times++;
  }
  while(times<=100);

#3


谢谢你!我先看看,是不是能够通过!ok?

#4


我这里有一个。。我给你说原理吧。程序我懒的写了。
定义一个数组array[0..99],

从0到9取一个随机数i
与第讲array[i]与array[100-i]的内容交换。
重复循环10次。

然后取数组中的0~9这10个元素,就是你要的不重复的随机数。

#5


crapex(编程浪子) 老兄啊!不行啊!我是要把这个放到一个Button的Click事件中的,我每次按一下就显示不同的结果!谢谢你,帮我再看看!

#6


还有没有人给我一点意见啊!各位朋友,来吧!我在线上等你们的答复!

#7


用我的试试啊。

#8


啊。。好象我的和你的要求不一样啊。呵呵。。

你的问题能不能说清楚点。

#9


你还不明白啊!我是用一个随机函数产生1到100的数,然后在Button的Click事件中将他们用Edit显示出来,但是每次显示的结果不相同!不需要把1到100的数都显示,只要能够显示几个就可以了!

#10


static int i[100],times=0,j;
    times++;
    for(j=0;j<times;j++)
    {
    i[times]=random(100)+1;
        if(i[times]!=i[j]&&times<=100)
        {
        Edit1->Text=i[times];
        break;
        }
      }
大家抢分呀!:))

#11


to lhr03(空空)

啊。。那就简单了。。你要产生几个就循环几次就可以了。放到数组中去啊。

代码就好象kekeguo()老兄说的一样。我懒的写了。呵呵。

#12


好的,我看看是不是能够运行!谢谢你!如果正常的一定给分

#13


ok!一切ok!好了谢谢你!我会给分的,老兄!kekeguo() 

#14


老兄!kekeguo()  你的程序有些问题,第一,你产生的随机数,总是有一定的规律的,例如第一次运行程序时Edit显示的是50,60,3,等等。当我重新再运行一次时产生同样的结果,这样产生的随机数由问题!第二,还是老问题,就是Edit重复显示数字,还是没有解决。希望那位高手再指点一下!!!

#15


random()并不是真正意义上的产生随机数的函数。
建议将时间加到随机因素里。

#16


试试这段程序:
先定义全局变量:int i[100],times=0;
    

    int l,j;
    randomize();
    l=random(100)+1;   //产生一个随机数付给临时变量
    for(j=0;j<times;j++)
    {
        if(l==i[j])  //如果产生的随机数与原有的相同,重新产生,再重新比较
        {
         l=random(100)+1;
         j=0;
        }
     }
     i[times]=l;  //将产生的与前面的值均不相同的值写到数组中(一定要后写,如果
                 //先写再判断就没有意义了).
    Edit1->Text=Edit1->Text+"  "+IntToStr(i[times]);
    times++;

#17


对不起,有个地方还有问题,即在循环中j=0;一句应改成j=-1;

#18


思路:将选中的数Numbers[pos]与数组中的最后一个数Numbers[Index]进行交换,下一次取数的时候从Numbers[0~Index-1]中取,直到所有100个数都被取出为止。即,将已经被使用过的数放到数组的后部,算法很快

int GetNumber(int* Numbers)
{
  int pos,result;
  static int Index = 99;           //存储已经用过的数的位置

  if(Index < 1)                    //如果用过超过100次,重置
    Index = 99;
  pos = random(Index+1);           //从0到Index之间随机取一个数,位置为pos
  result = *(Number+pos);          // 结果放到result中
  *(Number+pos) = *(Number+Index); //将Number[pos]和Number[Index]进行交换
  *(Number+Index) = result;        
  --Index;                         //下次取数的时候可选择的数范围为Numbers[0~Index-1]
  return result;                   // 返回结果
}
  

#19


关于:
-------------------------------------------------------------------------------
你的程序有些问题,第一,你产生的随机数,总是有一定的规律的,例如第一次运行程序时Edit显示的是50,60,3,等等。当我重新再运行一次时产生同样的结果,这样产生的随机数由问题!第二,还是老问题,就是Edit重复显示数字,还是没有解决。希望那位高手再指点一下!!! 
-------------------------------------------------------------------------------
请在调用GetNumber函数之前调用randomize函数一次即解决

#20


我那个确实完全错了……找个接口:昨天我困的不行了,后来直接睡觉去了。
改完了。再错我请你吃饭。
static int i[100],times=0,j;
    randomize();
    i[times]=random(100)+1;
    for(j=0;j<times;j++)
    {
        if(i[times]==i[j])
        {
         j=-1;
         i[times]=random(100)+1;
        }
        else if(times==100) return;
    }
    Edit1->Text=IntToStr(i[times]);
    times++;

winsky的方法很不错~~

#21


调试通过:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   int Rand[100],CurrRand;
   for(int k=0;k<=99;k++) Rand[k]=0;  //用于存放随机,并初始化
   randomize();
   for (int i=0;i<=99;i++)
   {
      CurrRand=random(100)+1;  //产生随机数
      while(IFExist(CurrRand,Rand,99))
      {
        CurrRand=random(100)+1;
      }
      Rand[i]=CurrRand;
   }

//测试
   AnsiString ShowVal="";
   int i=0;
   for(int z=0;z<=99;z++)
   {
     ShowVal=ShowVal+" "+IntToStr(Rand[z]);
     i=i+Rand[z];
   }
   Edit2->Text=IntToStr(i);
   Edit1->Text=ShowVal;

}

其中:
bool IFExist(int values,int *p,int i);//P指向Rand数,i为数组上标值;

bool IFExist(int values,int *p,int i)
{
   for(int j=0;j<=i;j++)
   {
     if(p[j]==values)
     {
        return true;   //存在返回真;
     }
   }
   return false;
}

    

#22


to wyb_45(小兵)

你有没有播撒随机种子啊。

#23


啊。。错了。。是对lhr03(空空)说的。

#24


好的,我现在再试一下,有什么问题,我在请教各位!

#25


我测试了好像暂时没有什么问题了

#26


kekeguo(壳壳果?) 我看你for的括号里面有问题啊 你的定义times=0;
但是在for(j=0;j<times;j++) j和times一开始都是零,

#27


第一次没有重复的问题,所以第一个不用作循环判断的。
times++以后,从1开始判断是不是和i[0]重复。

你小子想骗我请客……

#28


关注关注,upup

#29


没有了,我刚才没有注意到!是我的不对,我错了,I am sorry!

#30


hehe,没关系地……
你这个像是作业题嘛……

#31


youlione(请多指教) 你写的我是过了,是正确的,你是把rand产生的数先全部放到数组里面再显示,但是Edit里面不能放这么多数据啊!后面的都看不到了!

#32


你可以用ListBox显示!

#33


但是我不想看到全部的数据!我只有看到一个就可以了!

#34


你可以先产生一个随机数,然后用这个随机数作为下一个产生随机数的随机函数的种子,这样里产生的数字的随机性就会大很多,你甚至还可以将一些运算方法随机产生在将以前产生的随机数相互再运算这样就更随机了!