为何打乱一定数目的数字总数变大的时候程序总是崩溃?求大神修改一下,不要太难
为什么打乱一定数目的数字总数变大的时候程序总是崩溃?求大神修改一下,不要太难啊
#include<iostream>
#include<time.h>
#include<algorithm>
#include <stdlib.h>
#define m 100000
#define random(x) (rand()%100)
using namespace std;
int main()
{
int x, y, z, a[m];
clock_t starttime, finishtime;
for (x = 0; x <m; x++)
{
a[x] = x;
}
starttime = clock();
srand((int)time(0));
for (y = 0; y < m; y++)
{
z = random(x);
swap(a[y], a[z]);
}
finishtime = clock();
double totaltime = (double)(finishtime - starttime) / CLOCKS_PER_SEC;
cout << totaltime << "s";
system("pause");
return 0;
}
------解决思路----------------------
对你的代码进行了改动:一方面改成了C的风格,你用g++编译应该没问题;建议宏定义用大写,这样代码读起来比较清晰;
------解决思路----------------------
楼主,你插上断点看看是哪崩的,如果你的数是1000000,那应该是栈区溢出,操作系统一般给某个应用程序分配大概1M或2M的栈区空间,你的1000000 = 10^6,乘上sizeof(int)就是4*10^6,大约为4M
------解决思路----------------------
可以定义动态数组,即指针,int *a = new int[m];
------解决思路----------------------
仅供参考:
#include<iostream>
#include<time.h>
#include<algorithm>
#include <stdlib.h>
#define m 100000
#define random(x) (rand()%100)
using namespace std;
int main()
{
int x, y, z, a[m];
clock_t starttime, finishtime;
for (x = 0; x <m; x++)
{
a[x] = x;
}
starttime = clock();
srand((int)time(0));
for (y = 0; y < m; y++)
{
z = random(x);
swap(a[y], a[z]);
}
finishtime = clock();
double totaltime = (double)(finishtime - starttime) / CLOCKS_PER_SEC;
cout << totaltime << "s";
system("pause");
return 0;
}
------解决思路----------------------
#include <stdio.h>
#include<time.h>
#include <stdlib.h>
#define MAX 1000000 //不要太大,不然程序会崩溃,因为在栈上申请的空间,所以不能太大;
#define RANDOM() (rand()%100) //这个参数(x)是多余的,可以去掉了;
void swap(int *a, int *b);
int main(void)
{
int i, j, idx, array[MAX];
clock_t start_time, end_time;
for (i = 0; i < MAX; i++) {
array[i] = i;
}
srand((int)time(0));
start_time = clock();
for (j = 0; j < MAX; j++) {
idx = RANDOM();
swap(&array[j], &array[idx]);
}
end_time = clock();
double totaltime = (double)(end_time - start_time) / CLOCKS_PER_SEC;
printf("total time: %lf s\n", totaltime);
return 0;
}
void swap(int *a, int *b) //新加上去的
{
int tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
}
对你的代码进行了改动:一方面改成了C的风格,你用g++编译应该没问题;建议宏定义用大写,这样代码读起来比较清晰;
------解决思路----------------------
楼主,你插上断点看看是哪崩的,如果你的数是1000000,那应该是栈区溢出,操作系统一般给某个应用程序分配大概1M或2M的栈区空间,你的1000000 = 10^6,乘上sizeof(int)就是4*10^6,大约为4M
------解决思路----------------------
可以定义动态数组,即指针,int *a = new int[m];
------解决思路----------------------
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
srand(time(NULL));
printf("shuffle 0..n-1 demo\n");
for (n=1;n<=5;n++) {/* 测试1~5个元素 */
printf("_____n=%d_____\n",n);
j=1;
for (c=1;c<=n;c++) j=j*c;/* j为n! */
j*=n*2;
for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
for (i=n;i>0;i--) {/* 打乱0~n-1 */
a=i-1;b=rand()%i;
if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
}
printf("%04d:",c);
for (i=0;i<n;i++) printf("%d",d[i]);
printf("\n");
}
}
printf("shuffle 1..n demo\n");
for (n=1;n<=5;n++) {/* 测试1~5个元素 */
printf("_____n=%d_____\n",n);
j=1;
for (c=1;c<=n;c++) j=j*c;/* j为n! */
j*=n*2;
for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
for (i=n;i>1;i--) {/* 打乱1~n */
a=i;b=rand()%i+1;
if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
}
printf("%04d:",c);
for (i=1;i<=n;i++) printf("%d",d[i]);
printf("\n");
}
}
}
#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