To make this realistic you'll have to mix a couple of different methods. A key concept is that rice is a bunch of little individual grains and no two grains are exactly alike, even in terms of physical properties.
I started with this as a model for a grain of rice. It's an icosphere because I like to live dangerously.
I looked up the length of a grain of rice and scaled it down to around that size. I've measured the length here because we're going to use it as a reference for some scale values.
Shade smooth, subdiv 3. It's on a plane with a simple light blue texture, I turned the default point light into an area lamp with a strength of 1000w and scaled it up a bit to soften it.
I picked a slightly yellow base color, and a roughness value of .415.
Then I introduced some Subsurface Scattering. For the overall value I went with .0025 (half the model's length), and for radius I went heavily into red, a lot into green, and cut the blue out completely, in an attempt to bring out some orange. The reference I was using was a bit on the orange side, tweak to your preference. I think this worked -
but it's not really doing it for me because I don't think I'm capturing that slightly see-through quality of rice. So I decided to just start transmitting a large portion of the rays. I did a number of tests, my suspicion was that a Transmission Roughness of 1 would be necessary to avoid strange lighting and that turns out to be the case.
I think that .25 transmission is not an unreasonable look for a single grain of rice (rouse?). .35 is maybe getting a little rough looking but not outside the realm of possibility, where something like .1 is not that noticeable. So we've built kind of a default grain, and we can vary some of these values around their current levels to create variants.
To do this procedurally, we can introduce some microdisplacement, so we need to go to the material settings for the rice and enable Displacement and Bump under Settings.
And then we can run a Noise Texture into a Displacement node at a Scale comparable to part of the length of the model. I actually disabled the subdivision surface modifier for this, as I started thinking it was a bit too smooth. I scale the texture on the X axis here with a Mapping node, but basically I elongated the bumps along the length of the grain. Pick whatever axis is relevant for you.
And we've displaced the model just a bit. We can now do some math to randomize this displacement for every grain we generate. We can use several methods. If you are going to do this with Objects, Object Info > Random is your friend, if you are using particles there's a Particle Info node, and arrays can be randomized using Geometry > Random per island. I've set up a particle system here.
I just multiply the random value by some amount (don't go crazy) and throw it straight into the Location on the Mapping node. Sometimes you want to limit this to one or two axes, and you can do that with a Combine XYZ node.
We can use this Random value along with Color Ramps to further randomize the Base Color, Roughness, and the amount of Transmission. I used the values I already landed on as a guide for a new minimum and maximum value for the Color Ramps.
I cranked up the samples and did a render.
It's close, I went back and made the model a little skinnier, adjusted some of the values, and of course this was quite a close-up for rice. Here's a render after some time with it.