#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "windows.h"
#define TIMES 100
void swap(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
}
int main(int argc, char* argv[])
{
printf("MAX_RAND=%u\n", RAND_MAX);
srand((unsigned int)time(NULL));
DWORD inter = GetTickCount();
int a[TIMES];
int i = 0;
for (; i < TIMES; ++i)
{
a[i] = i;
}
for (i=TIMES; i > 0; --i)
{
swap(a[i], a[rand()%TIMES]);
}
inter = GetTickCount() - inter;
printf("inter=%u\n================\n", inter);
DWORD inter2 = ::GetTickCount();
int b[TIMES] = {0};
int m;
for (i=0; i<TIMES; i++)
{
while(b[m=rand()%TIMES]);
b[m] = i;
}
inter2 = ::GetTickCount() - inter2;
printf("inter2=%u\n================\n", inter2);
return 0;
}
14 个解决方案
#1
#pragma once
#include <string>
#include <windows.h>
class CAutoTimer
{
public:
CAutoTimer(const char* szName):m_strName(szName)
{
if( !QueryPerformanceFrequency (&m_nFrequency) )
{
m_nBegin.LowPart = GetTickCount();
m_bSupport = FALSE;
}
else
{
QueryPerformanceCounter(&m_nBegin);
m_bSupport = TRUE;;
}
}
~CAutoTimer()
{
if( !m_bSupport )
{
DWORD dwDelta = GetTickCount() - m_nBegin.LowPart;
printf("%s: %u (ms)\n", m_strName.c_str(), dwDelta);
}
else
{
LARGE_INTEGER end;
QueryPerformanceCounter(&end);
double fDelta = (double)(end.QuadPart - m_nBegin.QuadPart) * 1000 / m_nFrequency.QuadPart;
printf("%s: %f (ms)\n", m_strName.c_str(), fDelta);
}
}
private:
std::string m_strName;
LARGE_INTEGER m_nFrequency;
LARGE_INTEGER m_nBegin;
BOOL m_bSupport;
};
#define SET_AUTO_TIMER(name) CAutoTimer __CAutoTimer##name(#name)
#2
rand()
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子
#3
现在问题是printf("inter=%u\n================\n", inter);输出不了想要的值,我用VC6.0编译的
#4
%u->%f 试试
#5
肯定不行啊
#6
看错了,中间添加个Sleep(1500);
#7
#8
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "windows.h"
#define TIMES 100
void swap(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
}
int main(int argc, char* argv[])
{
printf("MAX_RAND=%u\n", RAND_MAX);
srand((unsigned int)time(NULL));
DWORD inter = GetTickCount();
int a[TIMES];
int i = 0;
for (; i < TIMES; ++i)
{
a[i] = i;
}
for (i=TIMES-1; i > 0; --i) // note
{
swap(a[i], a[rand()%TIMES]);
}
Sleep(1000);// note
inter = GetTickCount() - inter;
printf("inter=%u\n================\n", inter);
DWORD inter2 = ::GetTickCount();
int b[TIMES] = {0};
int m;
for (i=0; i<TIMES; i++)
{
while(b[m=rand()%TIMES]);
b[m] = i;
}
Sleep(1000);// note
inter2 = ::GetTickCount() - inter2;
printf("inter2=%u\n================\n", inter2);
return 0;
}
#9
是解决了,但为什么呢
#10
“printf("inter=%u\n================\n", inter);输出不了想要的值”
这句话什么意思?你要的是什么?Inter是tick流逝的个数。
#11
解决什么了?
延时会让打印出来的时间差大一点,这有什么改变么?
#12
你自己试试啊,最起码打印出来的值靠谱了,就是不明白为什么加Sleep()就能解决
#13
楼主概念不清啊!
随机必然有重复,所谓“不重复随机”不是随机,而是洗牌。
洗牌请参考下面:
随机必然有重复,所谓“不重复随机”不是随机,而是洗牌。
洗牌请参考下面:
#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");
}
}
}
#14
不好意思,
首先,我的要求是取得随机数去掉其中重复数值,这与随机数有没有重复没关系吧,而且你说的也有问题,随机数也有可能没重复的。
其次,这段代码探讨的是思路与效率问题。
最后,我不知道你运行过这段代码没,得到这段代码想要的结果了?
#1
#pragma once
#include <string>
#include <windows.h>
class CAutoTimer
{
public:
CAutoTimer(const char* szName):m_strName(szName)
{
if( !QueryPerformanceFrequency (&m_nFrequency) )
{
m_nBegin.LowPart = GetTickCount();
m_bSupport = FALSE;
}
else
{
QueryPerformanceCounter(&m_nBegin);
m_bSupport = TRUE;;
}
}
~CAutoTimer()
{
if( !m_bSupport )
{
DWORD dwDelta = GetTickCount() - m_nBegin.LowPart;
printf("%s: %u (ms)\n", m_strName.c_str(), dwDelta);
}
else
{
LARGE_INTEGER end;
QueryPerformanceCounter(&end);
double fDelta = (double)(end.QuadPart - m_nBegin.QuadPart) * 1000 / m_nFrequency.QuadPart;
printf("%s: %f (ms)\n", m_strName.c_str(), fDelta);
}
}
private:
std::string m_strName;
LARGE_INTEGER m_nFrequency;
LARGE_INTEGER m_nBegin;
BOOL m_bSupport;
};
#define SET_AUTO_TIMER(name) CAutoTimer __CAutoTimer##name(#name)
#2
rand()
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子
会根据前面的srand得到的种子按照一定规律得到数值,所以你的循环可能永远不能得到你要的;
你得每一次调用rand()之前,调用srand更新种子
#3
现在问题是printf("inter=%u\n================\n", inter);输出不了想要的值,我用VC6.0编译的
#4
%u->%f 试试
#5
肯定不行啊
#6
看错了,中间添加个Sleep(1500);
#7
#8
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "windows.h"
#define TIMES 100
void swap(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
}
int main(int argc, char* argv[])
{
printf("MAX_RAND=%u\n", RAND_MAX);
srand((unsigned int)time(NULL));
DWORD inter = GetTickCount();
int a[TIMES];
int i = 0;
for (; i < TIMES; ++i)
{
a[i] = i;
}
for (i=TIMES-1; i > 0; --i) // note
{
swap(a[i], a[rand()%TIMES]);
}
Sleep(1000);// note
inter = GetTickCount() - inter;
printf("inter=%u\n================\n", inter);
DWORD inter2 = ::GetTickCount();
int b[TIMES] = {0};
int m;
for (i=0; i<TIMES; i++)
{
while(b[m=rand()%TIMES]);
b[m] = i;
}
Sleep(1000);// note
inter2 = ::GetTickCount() - inter2;
printf("inter2=%u\n================\n", inter2);
return 0;
}
#9
是解决了,但为什么呢
#10
“printf("inter=%u\n================\n", inter);输出不了想要的值”
这句话什么意思?你要的是什么?Inter是tick流逝的个数。
#11
解决什么了?
延时会让打印出来的时间差大一点,这有什么改变么?
#12
你自己试试啊,最起码打印出来的值靠谱了,就是不明白为什么加Sleep()就能解决
#13
楼主概念不清啊!
随机必然有重复,所谓“不重复随机”不是随机,而是洗牌。
洗牌请参考下面:
随机必然有重复,所谓“不重复随机”不是随机,而是洗牌。
洗牌请参考下面:
#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");
}
}
}
#14
不好意思,
首先,我的要求是取得随机数去掉其中重复数值,这与随机数有没有重复没关系吧,而且你说的也有问题,随机数也有可能没重复的。
其次,这段代码探讨的是思路与效率问题。
最后,我不知道你运行过这段代码没,得到这段代码想要的结果了?