user-0 提问: c语言随机整数生成

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <time.h> unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } unsigned __int64 ullrand(void) {     return (      (((unsigned __int64)ulrand())<<32)     | ((unsigned __int64)ulrand())); } int i; unsigned long ul; unsigned __int64 ull; void main() {     srand(time(NULL));     for (i=0;i<10;i++) {         ul=ulrand();         printf("%010lu 0x%08x\n",ul,ul);     }     for (i=0;i<10;i++) {         ull=ullrand();         printf("%020I64u 0x%016I64x\n",ull,ull);     } } //3971076432 0xecb1d150 //2433428051 0x910b2a53 //1415415336 0x545d8628 //1312330759 0x4e389407 //1845758378 0x6e0409aa //0008069933 0x007b232d //4202720757 0xfa806df5 //2669855255 0x9f22c217 //0312068736 0x1299ca80 //2084555989 0x7c3fccd5 //03502077880857307931 0x3099e1472040ab1b //16884702393146816355 0xea52835e19b43763 //01877364819396611730 0x1a0dbd5b45f34e92 //07839440151924835771 0x6ccb4948756a05bb //09471412086917299176 0x8371371c820bfbe8 //04411255971577469925 0x3d37edef2f321be5 //13735846279546091130 0xbe9f876a65b7367a //04512980766520059820 0x3ea15418aa9927ac //15821377118299441610 0xdb90d2a9f1bb49ca //15512417228822200185 0xd7472d480398bf79

user: user-0
content: 引用 10 楼 mewiteor 的回复:[quote=引用 9 楼 wo2cj 的回复:] [quote=引用 8 楼 mewiteor 的回复:] [quote=引用 6 楼 wo2cj 的回复:] 5楼的朋友给的程序是可以的，但是当数组array[ ]的上限不能达到20000000，请指教。 20改成20000000就可以了，我写20是为了输出方便。 array的容量上限与get_rand的实现有关。rand()&0x7f的上限是2^15，(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^30,((unsigned long long)rand()&0x7f)<<30|(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^45,以此类推。[/quote]  20改成20000000后，当运行的时候，会出现 ‘停止运行’的结果。感觉是超出运行上限了。[/quote] 那就改成全局变量，应该是栈不够用。[/quote]  当数组是array[ 100000]，并且作为全局变量，可以运行，但是运行结果如下：  1 100000 99999 99998 99997  99996 99995 99994 99993 99992  99991 99990 99989 99988 99987  99986 99985 99984 99983 99982  99981 99980 99979 99978 99977  99976 99975 99974 99973 99972  99971 99970 99969 99968 99967  99966 99965 99964 99963 99962  99961 99960 99959 99958 99957  99956 99955 99954 99953 99952  99951 99950 99949 99948 99947  99946 99945 99944 99943 99942  99941 99940 99939 99938 99937  99936 99935 99934 99933 99932  99931 99930 99929 99928 99927  99926 99925 99924 99923 99922  99921 99920 99919 99918 99917  99916 99915 99914 99913 99912  99911 99910 99909 99908 99907  99906 99905 99904 99903 99902  99901 99900 99899 99898 99897  99896 99895 99894 99893 99892  99891 99890 99889 99888 99887  99886 99885 99884 99883 99882  99881 99880 99879 99878 99877  99876 99875 99874 99873 99872  99871 99870 99869 99868 99867  99866 99865 99864 99863 99862  99861 99860 99859 99858 99857  99856 99855 99854 99853 99852  ...............  101 100 99 98 97  96 95 94 93 92  91 90 89 88 87  86 85 84 83 82  81 80 79 78 77  76 75 74 73 72  71 70 69 68 67  66 65 64 63 62  61 60 59 58 57  56 55 54 53 52  51 50 49 48 47  46 45 44 43 42  41 40 39 38 37  36 35 34 33 32  12 29 2 24 25  21 13 28 8 20  18 5 27 16 31  15 3 9 17 30  11 14 23 7 19  4 10 26 6 22   运行结果基本都是有规律的，是由大到小的输出。

user: user-0
content: 感谢所有人的帮忙，感谢mewiteor！

user: user-0
content: 引用 12 楼 mewiteor 的回复:[quote=引用 11 楼 wo2cj的回复:][quote=引用 10 楼 mewiteor 的回复:] [quote=引用 9 楼 wo2cj 的回复:] [quote=引用 8 楼 mewiteor 的回复:] [quote=引用 6 楼 wo2cj 的回复:] 5楼的朋友给的程序是可以的，但是当数组array[ ]的上限不能达到20000000，请指教。 20改成20000000就可以了，我写20是为了输出方便。 array的容量上限与get_rand的实现有关。rand()&0x7f的上限是2^15，(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^30,((unsigned long long)rand()&0x7f)<<30|(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^45,以此类推。[/quote]  20改成20000000后，当运行的时候，会出现 ‘停止运行’的结果。感觉是超出运行上限了。[/quote] 那就改成全局变量，应该是栈不够用。[/quote]  当数组是array[ 100000]，并且作为全局变量，可以运行，但是运行结果如下：  1 100000 99999 99998 99997  99996 99995 99994 99993 99992  99991 99990 99989 99988 99987  99986 99985 99984 99983 99982  99981 99980 99979 99978 99977  99976 99975 99974 99973 99972  99971 99970 99969 99968 99967  99966 99965 99964 99963 99962  99961 99960 99959 99958 99957  99956 99955 99954 99953 99952  99951 99950 99949 99948 99947  99946 99945 99944 99943 99942  99941 99940 99939 99938 99937  99936 99935 99934 99933 99932  99931 99930 99929 99928 99927  99926 99925 99924 99923 99922  99921 99920 99919 99918 99917  99916 99915 99914 99913 99912  99911 99910 99909 99908 99907  99906 99905 99904 99903 99902  99901 99900 99899 99898 99897  99896 99895 99894 99893 99892  99891 99890 99889 99888 99887  99886 99885 99884 99883 99882  99881 99880 99879 99878 99877  99876 99875 99874 99873 99872  99871 99870 99869 99868 99867  99866 99865 99864 99863 99862  99861 99860 99859 99858 99857  99856 99855 99854 99853 99852  ...............  101 100 99 98 97  96 95 94 93 92  91 90 89 88 87  86 85 84 83 82  81 80 79 78 77  76 75 74 73 72  71 70 69 68 67  66 65 64 63 62  61 60 59 58 57  56 55 54 53 52  51 50 49 48 47  46 45 44 43 42  41 40 39 38 37  36 35 34 33 32  12 29 2 24 25  21 13 28 8 20  18 5 27 16 31  15 3 9 17 30  11 14 23 7 19  4 10 26 6 22   运行结果基本都是有规律的，是由大到小的输出。[/quote] 把get_rand第一行的m的赋值改成 (1<<30)/mod*mod; 少了对括号[/quote]   谢谢！ 太感激了。

user: user-2
content: 引用 11 楼 wo2cj的回复:[quote=引用 10 楼 mewiteor 的回复:] [quote=引用 9 楼 wo2cj 的回复:] [quote=引用 8 楼 mewiteor 的回复:] [quote=引用 6 楼 wo2cj 的回复:] 5楼的朋友给的程序是可以的，但是当数组array[ ]的上限不能达到20000000，请指教。 20改成20000000就可以了，我写20是为了输出方便。 array的容量上限与get_rand的实现有关。rand()&0x7f的上限是2^15，(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^30,((unsigned long long)rand()&0x7f)<<30|(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^45,以此类推。[/quote]  20改成20000000后，当运行的时候，会出现 ‘停止运行’的结果。感觉是超出运行上限了。[/quote] 那就改成全局变量，应该是栈不够用。[/quote]  当数组是array[ 100000]，并且作为全局变量，可以运行，但是运行结果如下：  1 100000 99999 99998 99997  99996 99995 99994 99993 99992  99991 99990 99989 99988 99987  99986 99985 99984 99983 99982  99981 99980 99979 99978 99977  99976 99975 99974 99973 99972  99971 99970 99969 99968 99967  99966 99965 99964 99963 99962  99961 99960 99959 99958 99957  99956 99955 99954 99953 99952  99951 99950 99949 99948 99947  99946 99945 99944 99943 99942  99941 99940 99939 99938 99937  99936 99935 99934 99933 99932  99931 99930 99929 99928 99927  99926 99925 99924 99923 99922  99921 99920 99919 99918 99917  99916 99915 99914 99913 99912  99911 99910 99909 99908 99907  99906 99905 99904 99903 99902  99901 99900 99899 99898 99897  99896 99895 99894 99893 99892  99891 99890 99889 99888 99887  99886 99885 99884 99883 99882  99881 99880 99879 99878 99877  99876 99875 99874 99873 99872  99871 99870 99869 99868 99867  99866 99865 99864 99863 99862  99861 99860 99859 99858 99857  99856 99855 99854 99853 99852  ...............  101 100 99 98 97  96 95 94 93 92  91 90 89 88 87  86 85 84 83 82  81 80 79 78 77  76 75 74 73 72  71 70 69 68 67  66 65 64 63 62  61 60 59 58 57  56 55 54 53 52  51 50 49 48 47  46 45 44 43 42  41 40 39 38 37  36 35 34 33 32  12 29 2 24 25  21 13 28 8 20  18 5 27 16 31  15 3 9 17 30  11 14 23 7 19  4 10 26 6 22   运行结果基本都是有规律的，是由大到小的输出。[/quote] 把get_rand第一行的m的赋值改成 (1<<30)/mod*mod; 少了对括号

user: user-2
content: 引用 6 楼 wo2cj 的回复:5楼的朋友给的程序是可以的，但是当数组array[ ]的上限不能达到20000000，请指教。 20改成20000000就可以了，我写20是为了输出方便。 array的容量上限与get_rand的实现有关。rand()&0x7f的上限是2^15，(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^30,((unsigned long long)rand()&0x7f)<<30|(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^45,以此类推。

user: user-2
content: 引用 9 楼 wo2cj 的回复:[quote=引用 8 楼 mewiteor 的回复:] [quote=引用 6 楼 wo2cj 的回复:] 5楼的朋友给的程序是可以的，但是当数组array[ ]的上限不能达到20000000，请指教。 20改成20000000就可以了，我写20是为了输出方便。 array的容量上限与get_rand的实现有关。rand()&0x7f的上限是2^15，(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^30,((unsigned long long)rand()&0x7f)<<30|(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^45,以此类推。[/quote]  20改成20000000后，当运行的时候，会出现 ‘停止运行’的结果。感觉是超出运行上限了。[/quote] 那就改成全局变量，应该是栈不够用。

user: user-0
content: 引用 8 楼 mewiteor 的回复:[quote=引用 6 楼 wo2cj 的回复:] 5楼的朋友给的程序是可以的，但是当数组array[ ]的上限不能达到20000000，请指教。 20改成20000000就可以了，我写20是为了输出方便。 array的容量上限与get_rand的实现有关。rand()&0x7f的上限是2^15，(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^30,((unsigned long long)rand()&0x7f)<<30|(rand()&0x7f)<<15|(rand()&0x7f)的上限是2^45,以此类推。[/quote]  20改成20000000后，当运行的时候，会出现 ‘停止运行’的结果。感觉是超出运行上限了。

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<time.h> #include<assert.h>  #define ARRAY_SIZE(array) sizeof(array)/sizeof(*(array)) void init_array(int *array,size_t size); void rand_sort(int *array,size_t size); void print_array(int *array,size_t size); int get_rand(int mod); void swap(int *a,int *b);  int main() { 	// int array[20000000];     int array[20]; // size最大2^30，即1073741824     init_array(array,ARRAY_SIZE(array));     rand_sort(array,ARRAY_SIZE(array));     print_array(array,ARRAY_SIZE(array));     return 0; }  int get_rand(int mod) {     int t,m=1<<30/mod*mod;     do     {         t=(((int)rand()&0x7f)<<15|(rand()&0x7f))%mod;     }while(t>=m); // 这里保证t%mod的结果均匀分布     return t%mod; }  void swap(int *a,int *b) {     int t;     assert(a!=NULL&&b!=NULL);     t=*a;     *a=*b;     *b=t; }  void rand_sort(int *array,size_t size) {     size_t i,j;     assert(array!=NULL);     srand(time(NULL));     for(i=size;i>1;--i)         swap(array+i-1,array+get_rand(i)); }  void init_array(int *array,size_t size) {     assert(array!=NULL);     assert(size!=0);     while(size--)array[size]=size+1; }  void print_array(int *array,size_t size) {     assert(array!=NULL);     assert(size!=0);     while(size--)printf("%d ",array[size]);     putchar('\n'); }

user: user-3
content: 直接rand()函数来改一下就行了嘛。 就用两个值一个值最大是32768，两个的话，最大值可以变成3276832768里面？够给20000000用了。而前面两个值可以用int，那个值之后可以用一个长整形来声明嘛。

user: user-0
content: 5楼的朋友给的程序是可以的，但是当数组array[ ]的上限不能达到20000000，请指教。

user: user-4
content: typedef int (*rng)(void); //假定eng()产生rngbits位随机正整数，在一定次数的调用 //eng()后生成[min, max)区间内均匀分布的正整数 int scale(rng eng, int rngbits, int min, int max) {     int range = max - min,         mask = 1 << rngbits,         count = 1, limit = range, i, ret;     //保证mask = count * 2 ^ rngbits大于range以便取余     while (mask < range)     {         mask <<= rngbits;         count++;     }     //设调用eng()函数count次后得到一正整数，该正整数     //如均匀落在[0, limit]内，则其对range取余的结果     //也将均匀地落在[0, range]内；否则，舍弃该结果     limit = mask / range * range;     while (1)     {         ret = 0;         for (i = 0; i < count; i++)         {             ret <<= rngbits;             ret |= eng();         }         if (ret <= limit) return (ret % range) + min;     } }

user: user-5
content: 用编译系统自带的rand（）函数是实现不了了，倒是将0-20000000随机排序这个思路还可以试试

user: user-0
content: 我是要输出0到20000000之间的所有随机整数。

user: user-6
content: #include <stdio.h> #include <time.h> #include <stdlib.h>  int main() { 	srand((unsigned)time(NULL)); 	for(int i=0;i<10;i++) 		printf("%d%d%d%d%d%d%d%d\n",rand()%2,rand()%10,rand()%10,rand()%10,rand()%10,rand()%10,rand()%10,rand()%10); 	return 0; } 用最简单的方法 你可以试试找rand函数的实现 在里面应该可以修改