opencv生成随机数函数

demeng2591 2015-05-25 08:46:14
opencv2提供了RNG 函数来生成随机数,但是重新运行的时候结果都是一样的,怎样解决啊?还有没有其他函数能够指定种子,从而使每次运行的结果都不一样啊?
...全文
177 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
demeng2591 2015-05-31
  • 打赏
  • 举报
回复
[quote=引用 8 楼 zhao4zhong1 的回复:] File: "C:\Program Files\OpenCV\modules\core\include\opencv2\core\types_c.h" [code=c] 379: /*************** Random number generation *******************/ 380: 381: typedef uint64 CvRNG; 382: 383: #define CV_RNG_COEFF 4164903690U 384: 385: CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1)) 386: { 387: CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1; 388: return rng; 389: } 谢谢您,问题已解决!!!
demeng2591 2015-05-28
  • 打赏
  • 举报
回复
引用 1 楼 a30037338 的回复:
用C语言的随机数 #include<time.h> #include<stdlib.h> #include<stdio.h> int main() { srand(time(0)); //种下种子,种一次就行了, 不要重复调用这个函数 int i = 0; for(i; i < 10 ;++i;) printf("%d ", rand()%100); //得到100以内的随机数 return 0; }
谢谢啦,rand()和srand()早就知道,也确实可以,我用的是opencv库,opencv有自带的可以设置种子的函数吗?想了解
demeng2591 2015-05-28
  • 打赏
  • 举报
回复
引用 2 楼 cjqpker 的回复:
为什么不直接用rand(),srand()可以指定种子
谢谢啦,rand(),srand()早就了解,只是想问问opencv里有没有自带的可以设置种子的函数,用了rand(),srand()确实是可以的!
demeng2591 2015-05-28
  • 打赏
  • 举报
回复
我本来想问,opencv有没有自带的函数可以设置种子来产生随机数,大家都推荐用rand()和srand(),用了后效果还不错!算是解决了吧!
赵4老师 2015-05-28
  • 打赏
  • 举报
回复
File: "C:\Program Files\OpenCV\modules\core\include\opencv2\core\types_c.h"

    379: /*************** Random number generation *******************/
    380: 
    381: typedef uint64 CvRNG;
    382: 
    383: #define CV_RNG_COEFF 4164903690U
    384: 
    385: CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1))
    386: {
    387:     CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1;
    388:     return rng;
    389: }
    390: 
    391: /* Return random 32-bit unsigned integer: */
    392: CV_INLINE unsigned cvRandInt( CvRNG* rng )
    393: {
    394:     uint64 temp = *rng;
    395:     temp = (uint64)(unsigned)temp*CV_RNG_COEFF + (temp >> 32);
    396:     *rng = temp;
    397:     return (unsigned)temp;
    398: }
    399: 
    400: /* Returns random floating-point number between 0 and 1: */
    401: CV_INLINE double cvRandReal( CvRNG* rng )
    402: {
    403:     return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */;
    404: }
赵4老师 2015-05-28
  • 打赏
  • 举报
回复
上一页 目 录 下一页 RandInt RandInt 返回 32-bit 无符号整型并更新 RNG unsigned cvRandInt( CvRNG* rng ); rng 被 cvRNG 初始化的 RNG 状态,被 RandSetRange (虽然, 后面这个函数对我们正讨论的函数的结果没有什么影响)随意地设置。 函数 cvRandInt 返回均匀分布的随机 32-bit 无符号整型值并更新 RNG 状态。它和 C 运行库里面的 rand() 函数十分相似,但是它产生的总是一个 32-bit 数而 rand() 返回一个 0 到 RAND_MAX (它是 2**16 或者 2**32, 依赖于操作平台)之间的数。 该函数用来产生一个标量随机数,例如点, patch sizes, table indices 等,用模操作可以产生一个确定边界的整数,人和其他特定的边界缩放到 0.. 1可以产生一个浮点数。下面是用 cvRandInt 重写的前一个函数讨论的例子: /* the input and the task is the same as in the previous sample. */ CvRNG rng_state = cvRNG(0xffffffff); int i, pointCount = 1000; /* ... - no arrays are allocated here */ CvSize size = cvGetSize( noisy_screen ); /* make a buffer for normally distributed numbers to reduce call overhead */ #define bufferSize 16 float normalValueBuffer[bufferSize]; CvMat normalValueMat = cvMat( bufferSize, 1, CV_32F, normalValueBuffer ); int valuesLeft = 0; for( i = 0; i < pointCount; i++ ) { CvPoint pt; /* generate random point */ pt.x = cvRandInt( &rng_state ) % size.width; pt.y = cvRandInt( &rng_state ) % size.height; if( valuesLeft <= 0 ) { /* fulfill the buffer with normally distributed numbers if the buffer is empty */ cvRandArr( &rng_state, &normalValueMat, CV_RAND_NORMAL, cvRealScalar(100), cvRealScalar(30) ); valuesLeft = bufferSize; } ((float*)cvPtr2D( noisy_screen, pt.y, pt.x, 0 ) = normalValueBuffer[--valuesLeft]; } /* there is no need to deallocate normalValueMat because we have both the matrix header and the data on stack. It is a common and efficient practice of working with small, fixed-size matrices */ 收录时间:2007年7月18日,16点16分 编辑时间:2007年7月18日,16点16分
假正经的班长 2015-05-26
  • 打赏
  • 举报
回复
为什么不直接用rand(),srand()可以指定种子
此后三年 2015-05-26
  • 打赏
  • 举报
回复
用C语言的随机数 #include<time.h> #include<stdlib.h> #include<stdio.h> int main() { srand(time(0)); //种下种子,种一次就行了, 不要重复调用这个函数 int i = 0; for(i; i < 10 ;++i;) printf("%d ", rand()%100); //得到100以内的随机数 return 0; }
赵4老师 2015-05-26
  • 打赏
  • 举报
回复
仅供参考:
#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

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧