鱼C论坛

 找回密码
 立即注册
查看: 1737|回复: 1

[已解决]为什么这个程序能生成不重复的指定范围的随机数列呢?

[复制链接]
发表于 2018-1-8 16:26:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std;
  5. int creatdata(int arr[],int n ,int min,int max)
  6. {
  7.     int flag;
  8.     srand((unsigned int)time(NULL));
  9.     if(max-min+1<n) return 0;
  10.     for(int i=0;i<n;i++)
  11.     {
  12.         do
  13.         {
  14.             arr[i]=(max-min+1)*rand()/(RAND_MAX+1)+min;
  15.             flag=0;
  16.             for(int j=0;j<i;j++)
  17.             {
  18.                 if(arr[i]==arr[j])
  19.                     flag=1;
  20.             }
  21.         }
  22.     while(flag);
  23.     }
  24.     return 1;
  25. }
  26. int main()
  27. {
  28.     int arr[15];
  29.     int min=-5,max=100;
  30.     creatdata(arr,15,min,max);
  31.     for(int &x:arr)
  32.         cout<<x<<" "<<endl;

  33.     return 0;
  34. }
复制代码

arr=(max-min+1)*rand()/(RAND_MAX+1)+min;这一句我没太看明白,请dalao解释一下,谢谢了
最佳答案
2018-1-8 20:20:17
这就是数学的魅力
^_^



你可以看看这个
http://blog.csdn.net/u010141928/article/details/71439570
http://blog.csdn.net/iamhalfmoon/article/details/6010710

另外,再给出我自己写的代码
  1. #include <iostream>
  2. #include <iomanip>

  3. int GetResult(int min, int max, int r)
  4. {
  5.         return (max - min + 1) * r / (RAND_MAX + 1) + min;
  6. }

  7. int GetMin(int min, int max, int i)
  8. {
  9.         for(int r = 0; r <= RAND_MAX; ++r)
  10.         {
  11.                 if(GetResult(min, max, r) == i)
  12.                         return r;
  13.         }

  14.         return -1;
  15. }

  16. int GetMax(int min, int max, int i)
  17. {
  18.         int r = 0;

  19.         for(; r <= RAND_MAX; ++r)
  20.         {
  21.                 if(GetResult(min, max, r) == i)
  22.                         break;
  23.         }

  24.         for(; r <= RAND_MAX; ++r)
  25.         {
  26.                 if(GetResult(min, max, r) != i)
  27.                         return r - 1;
  28.         }

  29.         return -1;
  30. }

  31. int main(void)
  32. {
  33.         int min = 0, max = 10;

  34.         std::cout << std::setfill('0') << std::setiosflags(std::ios::uppercase);

  35.         for(int i = min; i <= max; ++i)
  36.         {
  37.                 std::cout << std::dec << i;
  38.                 std::cout << "\t";
  39.                 std::cout << std::hex
  40.                         << "0x" << std::setw(8) << GetMin(min, max, i)
  41.                         << " - "
  42.                         << "0x" << std::setw(8) << GetMax(min, max, i)
  43.                         << std::endl;
  44.         }

  45.         return 0;
  46. }
复制代码
  1. 0       0x00000000 - 0x00000BA2
  2. 1       0x00000BA3 - 0x00001745
  3. 2       0x00001746 - 0x000022E8
  4. 3       0x000022E9 - 0x00002E8B
  5. 4       0x00002E8C - 0x00003A2E
  6. 5       0x00003A2F - 0x000045D1
  7. 6       0x000045D2 - 0x00005174
  8. 7       0x00005175 - 0x00005D17
  9. 8       0x00005D18 - 0x000068BA
  10. 9       0x000068BB - 0x0000745D
  11. 10      0x0000745E - 0xFFFFFFFF
  12. 请按任意键继续. . .
复制代码

  1. int min = -5, max = 10;
复制代码
  1. -5      0x00000000 - 0x000007FF
  2. -4      0x00000800 - 0x00000FFF
  3. -3      0x00001000 - 0x000017FF
  4. -2      0x00001800 - 0x00001FFF
  5. -1      0x00002000 - 0x000027FF
  6. 0       0x00002800 - 0x00002FFF
  7. 1       0x00003000 - 0x000037FF
  8. 2       0x00003800 - 0x00003FFF
  9. 3       0x00004000 - 0x000047FF
  10. 4       0x00004800 - 0x00004FFF
  11. 5       0x00005000 - 0x000057FF
  12. 6       0x00005800 - 0x00005FFF
  13. 7       0x00006000 - 0x000067FF
  14. 8       0x00006800 - 0x00006FFF
  15. 9       0x00007000 - 0x000077FF
  16. 10      0x00007800 - 0xFFFFFFFF
  17. 请按任意键继续. . .
复制代码


其实就是一个范围的分配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-8 20:20:17 | 显示全部楼层    本楼为最佳答案   
这就是数学的魅力
^_^



你可以看看这个
http://blog.csdn.net/u010141928/article/details/71439570
http://blog.csdn.net/iamhalfmoon/article/details/6010710

另外,再给出我自己写的代码
  1. #include <iostream>
  2. #include <iomanip>

  3. int GetResult(int min, int max, int r)
  4. {
  5.         return (max - min + 1) * r / (RAND_MAX + 1) + min;
  6. }

  7. int GetMin(int min, int max, int i)
  8. {
  9.         for(int r = 0; r <= RAND_MAX; ++r)
  10.         {
  11.                 if(GetResult(min, max, r) == i)
  12.                         return r;
  13.         }

  14.         return -1;
  15. }

  16. int GetMax(int min, int max, int i)
  17. {
  18.         int r = 0;

  19.         for(; r <= RAND_MAX; ++r)
  20.         {
  21.                 if(GetResult(min, max, r) == i)
  22.                         break;
  23.         }

  24.         for(; r <= RAND_MAX; ++r)
  25.         {
  26.                 if(GetResult(min, max, r) != i)
  27.                         return r - 1;
  28.         }

  29.         return -1;
  30. }

  31. int main(void)
  32. {
  33.         int min = 0, max = 10;

  34.         std::cout << std::setfill('0') << std::setiosflags(std::ios::uppercase);

  35.         for(int i = min; i <= max; ++i)
  36.         {
  37.                 std::cout << std::dec << i;
  38.                 std::cout << "\t";
  39.                 std::cout << std::hex
  40.                         << "0x" << std::setw(8) << GetMin(min, max, i)
  41.                         << " - "
  42.                         << "0x" << std::setw(8) << GetMax(min, max, i)
  43.                         << std::endl;
  44.         }

  45.         return 0;
  46. }
复制代码
  1. 0       0x00000000 - 0x00000BA2
  2. 1       0x00000BA3 - 0x00001745
  3. 2       0x00001746 - 0x000022E8
  4. 3       0x000022E9 - 0x00002E8B
  5. 4       0x00002E8C - 0x00003A2E
  6. 5       0x00003A2F - 0x000045D1
  7. 6       0x000045D2 - 0x00005174
  8. 7       0x00005175 - 0x00005D17
  9. 8       0x00005D18 - 0x000068BA
  10. 9       0x000068BB - 0x0000745D
  11. 10      0x0000745E - 0xFFFFFFFF
  12. 请按任意键继续. . .
复制代码

  1. int min = -5, max = 10;
复制代码
  1. -5      0x00000000 - 0x000007FF
  2. -4      0x00000800 - 0x00000FFF
  3. -3      0x00001000 - 0x000017FF
  4. -2      0x00001800 - 0x00001FFF
  5. -1      0x00002000 - 0x000027FF
  6. 0       0x00002800 - 0x00002FFF
  7. 1       0x00003000 - 0x000037FF
  8. 2       0x00003800 - 0x00003FFF
  9. 3       0x00004000 - 0x000047FF
  10. 4       0x00004800 - 0x00004FFF
  11. 5       0x00005000 - 0x000057FF
  12. 6       0x00005800 - 0x00005FFF
  13. 7       0x00006000 - 0x000067FF
  14. 8       0x00006800 - 0x00006FFF
  15. 9       0x00007000 - 0x000077FF
  16. 10      0x00007800 - 0xFFFFFFFF
  17. 请按任意键继续. . .
复制代码


其实就是一个范围的分配
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 17:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表