C ++从随机函数中删除元素

时间:2014-04-26 16:53:04

标签: c++ random elements

我想创建一个2D array a[5][5],其中没有2个相同的数字,元素都不是0(元素是由函数random(70)生成的)所以我想知道如何删除零和确保没有2个相同的数字?

1 个答案:

答案 0 :(得分:2)

您可以使用以下内容

const size_t N = 5;
int a[N][N];

std::srand( ( unsigned int )std::time( 0 ) );

int *p = reinterpret_cast<int *>( a );

for ( size_t i = 0; i < N * N; i++ ) 
{
   int x;

   while ( !( x = std::rand() % 70 ) || std::find( p, p + i, x ) != p + i ) {}
   p[i] = x;
}

这是一个例子

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>


int main() 
{
    const size_t N = 5; 
    int a[N][N];

    std::srand( ( unsigned int )std::time( 0 ) );

    int *p = reinterpret_cast<int *>( a );

    for ( size_t i = 0; i < N * N; i++ )
    {
        int x;

        while ( !( x = std::rand() % 70 ) || std::find( p, p + i, x ) != p + i );

        p[i] = x;
    }   

    for ( const auto &row : a )
    {
        for ( int x : row ) std::cout << x << ' ';
        std::cout << std::endl;
    }
    return 0;
}

示例输出

66 23 32 6 18 
8 31 55 10 43 
39 2 28 4 56 
5 58 47 46 68 
59 25 26 9 50 

这种方法不需要额外的内存。

另一种方法是使用std::bitset。例如

const size_t N = 5; 
int a[N][N];

std::bitset<70> b;
b.set( 0 );


std::srand( ( unsigned int )std::time( 0 ) );


for ( size_t i = 0; i < N; i++ )
{
    for ( size_t j = 0; j < N; j++ )
    {
        int x;

        while ( ( x = std::rand() % 70, b[x] ) );
        //or
        //while ( b[x = std::rand() % 70] );

        b.set( x );
        a[i][j] = x;
   }
}