在c中随机化一维数组中的序列[重复]
Posted
技术标签:
【中文标题】在c中随机化一维数组中的序列[重复]【英文标题】:randomizing a sequence in a 1d array in c [duplicate] 【发布时间】:2018-04-30 07:18:24 【问题描述】:**这不是生成数字,而是重新排列一维数组中的数字 需要帮助随机化 rbox 数组中的 0、1、2、3 数字序列。但是,当随机时,它显示 1,1,1,1 或 2,2,2,2 等。有人知道如何将序列随机化为 0,3,2,1 或 2,0,1,3 等吗?
srand(time(NULL));
int randomm = rand()%4;
int rbox[4];
int x;
for(x=0;x<4;x++)
rbox[x] = 0;
for(x=0;x<4;x++)
rbox[x] = randomm;
for(x=0;x<4;x++)
printf("%i", rbox[x]);
【问题讨论】:
看看Fisher-Yates shuffle。 您正在生成 一个 随机数,然后将该数字放入数组rbox
的 4 个元素中。那你期待什么?我怀疑您对编程做出了一些非常错误的假设。开始阅读一本好的初学者书籍。
【参考方案1】:
填充数组,然后打乱并打印打乱的数组。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 4
int main()
int rbox[SIZE] = 0;
int loop = 0;
int index = 0;
int swap = 0;
srand ( time( NULL));
for ( loop = 0; loop < SIZE; loop++)
rbox[loop] = loop;
loop = SIZE;
while ( loop)
index = rand ( ) % loop;
loop--;
swap = rbox[index];
rbox[index] = rbox[loop];
rbox[loop] = swap;;
for ( loop = 0; loop < SIZE; loop++)
printf ( "%d ", rbox[loop]);
printf ( "\n");
return 0;
【讨论】:
【参考方案2】:这是糟糕编码的典型例子。
随机变量获取一次值,并且您在循环中将相同的值分配给您的数组四次。
这样做,
for(x=0;x<4;x++)
rbox[x] = rand()%4;
但这将有机会重复随机值。 您需要在每次迭代时验证该值是否以前出现在数组中。
【讨论】:
【参考方案3】:for(x=0;x<4;x++)
rbox[x] = rand()%4;
将数组的每个元素分配给rand()
的不同输出。
在这里,您将数组 rbox
的每个元素分配给相同的值 (random
) - 这解释了为什么您获得相同的值。
数组洗牌:
从用户的评论看来,OP 想要创建数组的随机播放。
现在要做到这一点,您可以使用值 0,1,2,3
初始化整个数组,然后应用此算法
-- To shuffle an array a of n elements (indices 0..n-1):
for i from n−1 downto 1 do
j ← random integer such that 0 ≤ j ≤ i
exchange a[j] and a[i]
这被称为Fisher Yates Shuffle。
还有其他方法...
另一种方法是遵循这个算法:-
跟踪数字的范围(这基本上是
highestNumInRange - iteration Number
)。 然后跟踪您需要生成的元素数量。3.1。如果
2
乘以rand()
的比值小于1
,则将迭代次数放入数组中。3.2。否则增加迭代。
【讨论】:
谢谢,但知道如何让它独一无二吗? @andrewyong.: 你正在使用rand()
,你可以使用一个简单的算法,只要你看到相同的值......你将再次计算rand()
。
@andrewyong 使其独一无二是另一个问题。你会如何在纸上做到这一点?以上是关于在c中随机化一维数组中的序列[重复]的主要内容,如果未能解决你的问题,请参考以下文章
C语言数组详讲(一维数组二维数组的创建初识化及其使用等;建议收藏,干货慢慢)
LeetCode 1480. 一维数组的动态和 / 1588. 所有奇数长度子数组的和 / 528. 按权重随机选择(随机化)
php将一个二维数组按照某个字段值合并成一维数组,如果有重复则将重复的合并成二维数组