鱼C论坛

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

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

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

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

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

x
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int creatdata(int arr[],int n ,int min,int max)
{
    int flag;
    srand((unsigned int)time(NULL));
    if(max-min+1<n) return 0;
    for(int i=0;i<n;i++)
    {
        do
        {
            arr[i]=(max-min+1)*rand()/(RAND_MAX+1)+min;
            flag=0;
            for(int j=0;j<i;j++)
            {
                if(arr[i]==arr[j])
                    flag=1;
            }
        }
    while(flag);
    }
    return 1;
}
int main()
{
    int arr[15];
    int min=-5,max=100;
    creatdata(arr,15,min,max);
    for(int &x:arr)
        cout<<x<<" "<<endl;

    return 0;
}
arr[i]=(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

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

int GetResult(int min, int max, int r)
{
        return (max - min + 1) * r / (RAND_MAX + 1) + min;
}

int GetMin(int min, int max, int i)
{
        for(int r = 0; r <= RAND_MAX; ++r)
        {
                if(GetResult(min, max, r) == i)
                        return r;
        }

        return -1;
}

int GetMax(int min, int max, int i)
{
        int r = 0;

        for(; r <= RAND_MAX; ++r)
        {
                if(GetResult(min, max, r) == i)
                        break;
        }

        for(; r <= RAND_MAX; ++r)
        {
                if(GetResult(min, max, r) != i)
                        return r - 1;
        }

        return -1;
}

int main(void)
{
        int min = 0, max = 10;

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

        for(int i = min; i <= max; ++i)
        {
                std::cout << std::dec << i;
                std::cout << "\t";
                std::cout << std::hex
                        << "0x" << std::setw(8) << GetMin(min, max, i)
                        << " - "
                        << "0x" << std::setw(8) << GetMax(min, max, i)
                        << std::endl;
        }

        return 0;
}
0       0x00000000 - 0x00000BA2
1       0x00000BA3 - 0x00001745
2       0x00001746 - 0x000022E8
3       0x000022E9 - 0x00002E8B
4       0x00002E8C - 0x00003A2E
5       0x00003A2F - 0x000045D1
6       0x000045D2 - 0x00005174
7       0x00005175 - 0x00005D17
8       0x00005D18 - 0x000068BA
9       0x000068BB - 0x0000745D
10      0x0000745E - 0xFFFFFFFF
请按任意键继续. . .
int min = -5, max = 10;
-5      0x00000000 - 0x000007FF
-4      0x00000800 - 0x00000FFF
-3      0x00001000 - 0x000017FF
-2      0x00001800 - 0x00001FFF
-1      0x00002000 - 0x000027FF
0       0x00002800 - 0x00002FFF
1       0x00003000 - 0x000037FF
2       0x00003800 - 0x00003FFF
3       0x00004000 - 0x000047FF
4       0x00004800 - 0x00004FFF
5       0x00005000 - 0x000057FF
6       0x00005800 - 0x00005FFF
7       0x00006000 - 0x000067FF
8       0x00006800 - 0x00006FFF
9       0x00007000 - 0x000077FF
10      0x00007800 - 0xFFFFFFFF
请按任意键继续. . .

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

使用道具 举报

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



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

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

int GetResult(int min, int max, int r)
{
        return (max - min + 1) * r / (RAND_MAX + 1) + min;
}

int GetMin(int min, int max, int i)
{
        for(int r = 0; r <= RAND_MAX; ++r)
        {
                if(GetResult(min, max, r) == i)
                        return r;
        }

        return -1;
}

int GetMax(int min, int max, int i)
{
        int r = 0;

        for(; r <= RAND_MAX; ++r)
        {
                if(GetResult(min, max, r) == i)
                        break;
        }

        for(; r <= RAND_MAX; ++r)
        {
                if(GetResult(min, max, r) != i)
                        return r - 1;
        }

        return -1;
}

int main(void)
{
        int min = 0, max = 10;

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

        for(int i = min; i <= max; ++i)
        {
                std::cout << std::dec << i;
                std::cout << "\t";
                std::cout << std::hex
                        << "0x" << std::setw(8) << GetMin(min, max, i)
                        << " - "
                        << "0x" << std::setw(8) << GetMax(min, max, i)
                        << std::endl;
        }

        return 0;
}
0       0x00000000 - 0x00000BA2
1       0x00000BA3 - 0x00001745
2       0x00001746 - 0x000022E8
3       0x000022E9 - 0x00002E8B
4       0x00002E8C - 0x00003A2E
5       0x00003A2F - 0x000045D1
6       0x000045D2 - 0x00005174
7       0x00005175 - 0x00005D17
8       0x00005D18 - 0x000068BA
9       0x000068BB - 0x0000745D
10      0x0000745E - 0xFFFFFFFF
请按任意键继续. . .
int min = -5, max = 10;
-5      0x00000000 - 0x000007FF
-4      0x00000800 - 0x00000FFF
-3      0x00001000 - 0x000017FF
-2      0x00001800 - 0x00001FFF
-1      0x00002000 - 0x000027FF
0       0x00002800 - 0x00002FFF
1       0x00003000 - 0x000037FF
2       0x00003800 - 0x00003FFF
3       0x00004000 - 0x000047FF
4       0x00004800 - 0x00004FFF
5       0x00005000 - 0x000057FF
6       0x00005800 - 0x00005FFF
7       0x00006000 - 0x000067FF
8       0x00006800 - 0x00006FFF
9       0x00007000 - 0x000077FF
10      0x00007800 - 0xFFFFFFFF
请按任意键继续. . .

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-29 03:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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