Here are two ways in which you can accomplish this:
1) Modify the curve's twist
A bezier curve has the often ignored feature twist that you can set per control point to influence the direction in which the boards are pointing. You can set the twist manually in edit mode by selecting a control point and pressing Ctrl+T, but if you want to create the impression of randomness you will need a lot of control points and manually setting the tilt is going to be tedious.
The following Python script assigns a random tilt to each control point of a bezier curve.
import bpy
import random
from math import pi
curve = bpy.data.objects['Circle']
points = curve.data.splines[0].bezier_points
for point in points:
point.tilt = random.uniform(-pi/16, pi/16)
Adding the array and curve modifiers to the fence element will allow the fence to distort which is maybe useful for a wire-link fence but may cause ugly deformation of the fence poles.


For a fence consisting of disconnected planks, instead of a regular object array I use a plane array with duplifaces according to this or this answer, so the fence boards don't get distorted. I.e. add a plane, with modifiers array and curve, activate duplication in the plane's Object tab in the properties panel and parent a single fence board to the plane.
I guess it might be possible to try to mix these two approaches, i.e. use regular array for the mesh and duplifaces for the poles. As I don't have a wire-link mesh model available, I couldn't test it on one of those. Tests with a fence like above with horizontal bars were nonsatisfying.

2) Place the boards with Animation Nodes
Using the addon Animation Nodes allows you to place fence boards automatically at the desired location with the right orientation.
Here I use Animation Node's Evaluate Spline node to sample a number ob points along the bezier curve – and for each point get the coordinates as well as the tangent at that point. I project the tangent to the XY plane so that the standard orientation is “up” and not normal on the surface. This part is optional for a flat ground, but looks better if you place the fence on a hill.

I feed the coordinates, and the projected tangents into a loop. For each pair I create a random rotation with the Euler Wiggle node. The amplitudes of the wiggle node affect the amount of randomness for each axis.

There would be room for optimization, e.g. as the wiggle Evolution is linear whereas it might be desirable to match the evolution parameter at the start of the curve to the end of the curve, as it's a closed loop.
I combine the three transformations wiggle, rotation according to the tangent, and translation to the correct coordinate.
Back in the main node tree I place copies of the original board, each board with a transformation from the loop.
I also set a random shape key value for each board to get a random board height – similar to the random particle approach when using Dupligroups.


I tried something similar earlier with particles and merging was an issue there too. – Life Sep 11 '18 at 14:49